@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 = 'pembuat-alasan';
6
- const title = 'Pembuat Alasan';
7
- const description = 'Mesin perjudian semantik untuk melepaskan diri dari komitmen dengan gaya. Hasilkan alasan yang surealis dan tak terbantahkan secara instan.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Bisakah generator ini menyelamatkan pernikahan saya?',
12
- answer: 'Meskipun kami bukan terapis, menghindari makan malam dengan mertua menggunakan keadaan darurat teknis yang masuk akal dapat secara signifikan mengurangi ketegangan. Gunakanlah dengan bijak.'
13
- },
14
- {
15
- question: 'Mengapa kalimatnya begitu surealis?',
16
- answer: 'Strategi ini didasarkan pada Disonansi Kognitif. Jika Anda mengatakan sesuatu yang membosankan, itu dapat diverifikasi. Jika Anda mengatakan sesuatu yang tidak masuk akal, kejutan tersebut akan menghalangi rasa marah seseorang.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Hasilkan', text: 'Klik tombol buat untuk membuat alasan baru.' },
22
- { name: 'Salin', text: 'Klik tombol salin untuk memindahkan alasan tersebut ke papan klip Anda.' }
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: 'id',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Pertanyaan yang Sering Diajukan',
63
- ui: {
64
- title: 'Pembuat Alasan Surealis',
65
- description: 'Kalkulator alibi generasi berikutnya.',
66
- subjectLabel: 'Subjek',
67
- actionLabel: 'Tindakan',
68
- victimLabel: 'Korban',
69
- generateBtn: 'HASILKAN ALASAN',
70
- copyBtn: 'Salin kegilaan ini',
71
- copied: 'Tersalin!',
72
- starts: JSON.stringify([
73
- "Kucing saya", "Nenek saya", "Presiden", "Alien", "Tetangga saya dari lantai 5",
74
- "Wifi", "Horoskop saya", "Penjelajah waktu", "Mesin cuci", "Kulkas saya",
75
- "Semangat Natal", "Bayangan saya", "Seorang ninja", "Polisi vegan", "Siri",
76
- "Tanaman karnivora saya", "Kurir Amazon", "Klon jahat saya", "Seorang penyihir", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "telah menyatakan perang terhadap", "telah memakan", "telah menculik", "telah membakar",
80
- "sedang mengadakan pesta di", "telah muntah di", "menolak untuk meninggalkan",
81
- "telah meretas", "telah mencuri", "telah jatuh cinta dengan", "sedang merenungkan",
82
- "telah memberikan mantra pada", "sedang memprotes terhadap", "telah mendirikan aliran sesat di",
83
- "sedang menari samba di", "telah memanggil iblis di", "telah memblokir akses ke",
84
- "telah berubah menjadi emas", "sedang mencoba menjual", "telah menulis buku tentang"
85
- ]),
86
- ends: JSON.stringify([
87
- "kunci rumah saya.", "keinginan saya untuk hidup.", "pintu garasi.",
88
- "celana favorit saya.", "router ruang tamu.", "satu-satunya pasang sepatu saya.",
89
- "hukum fisika.", "martabat saya.", "lift gedung.",
90
- "akun Netflix saya.", "sikat gigi saya.", "akta rumah saya.",
91
- "koleksi pogs saya.", "rem tangan mobil.", "keinginan saya untuk bersosialisasi.",
92
- "persediaan kopi saya.", "tutup toilet.", "remot TV.",
93
- "kaus kaki keberuntungan saya.", "peradaban Barat."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Referensi'
97
- },
98
- seo: [
99
- { type: 'title', text: 'Seni Ilmiah dalam Membuat Alasan Sempurna', level: 2 },
100
- { type: 'paragraph', html: 'Kita hidup di era hiperkoneksi. Ponsel Anda bergetar, jam tangan memberi notifikasi, dan agenda sosial Anda terlihat seperti permainan Tetris yang hampir kalah. Tekanan untuk menyetujui segalanya telah menciptakan epidemi kelelahan sosial.' },
101
- { type: 'title', text: 'Kebangkitan JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'Meskipun FOMO (Fear of Missing Out) mendominasi dekade terakhir, para pakar kesehatan digital kini menganjurkan <strong>JOMO: Kegembiraan dalam Melewatkan Sesuatu</strong>. Ini bukan tentang isolasi, tetapi tentang intensionalitas.' },
103
- { type: 'tip', title: 'Formula Alibi yang Tak Terbantahkan', html: '<strong>Subjek yang Terdisosiasi:</strong> Anda tidak pernah menjadi pelakunya. Itu adalah "wifi", "kucing saya", "alam semesta". Alihkan kesalahan ke entitas eksternal.<br><strong>Tindakan Hiperbolik:</strong> Situasinya harus cukup tidak masuk akal atau cukup teknis sehingga tidak ada yang menanyakan detailnya.<br><strong>Blok Fisik:</strong> Hasil akhirnya harus biner: saya pergi atau saya tetap di rumah.' },
104
- { type: 'title', text: 'Sejarah Singkat Alasan', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Abad Pertengahan:</strong> "Kuda saya kehilangan tapalnya" (Klasik sepanjang masa).',
107
- '<strong>Revolusi Industri:</strong> "Mesin uapnya terlalu panas".',
108
- '<strong>Era Digital:</strong> "Internet saya terputus tepat di tengah pembaruan".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Meringankan tekanan sosial secara instan', con: 'Penggunaan berlebihan merusak kepercayaan' },
112
- { pro: 'Melindungi energi dan batasan Anda', con: 'Dapat menimbulkan rasa bersalah jika digunakan sembarangan' },
113
- { pro: 'Nada kreatif dan humoris meredakan ketegangan', con: 'Tidak cocok untuk konteks formal atau profesional' },
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 = 'pembuat-alasan';
6
+ const title = 'Pembuat Alasan';
7
+ const description = 'Mesin perjudian semantik untuk melepaskan diri dari komitmen dengan gaya. Hasilkan alasan yang surealis dan tak terbantahkan secara instan.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Bisakah generator ini menyelamatkan pernikahan saya?',
12
+ answer: 'Meskipun kami bukan terapis, menghindari makan malam dengan mertua menggunakan keadaan darurat teknis yang masuk akal dapat secara signifikan mengurangi ketegangan. Gunakanlah dengan bijak.'
13
+ },
14
+ {
15
+ question: 'Mengapa kalimatnya begitu surealis?',
16
+ answer: 'Strategi ini didasarkan pada Disonansi Kognitif. Jika Anda mengatakan sesuatu yang membosankan, itu dapat diverifikasi. Jika Anda mengatakan sesuatu yang tidak masuk akal, kejutan tersebut akan menghalangi rasa marah seseorang.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Hasilkan', text: 'Klik tombol buat untuk membuat alasan baru.' },
22
+ { name: 'Salin', text: 'Klik tombol salin untuk memindahkan alasan tersebut ke papan klip Anda.' }
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: 'id',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Pertanyaan yang Sering Diajukan',
63
+ ui: {
64
+ title: 'Pembuat Alasan Surealis',
65
+ description: 'Kalkulator alibi generasi berikutnya.',
66
+ subjectLabel: 'Subjek',
67
+ actionLabel: 'Tindakan',
68
+ victimLabel: 'Korban',
69
+ generateBtn: 'HASILKAN ALASAN',
70
+ copyBtn: 'Salin kegilaan ini',
71
+ copied: 'Tersalin!',
72
+ starts: JSON.stringify([
73
+ "Kucing saya", "Nenek saya", "Presiden", "Alien", "Tetangga saya dari lantai 5",
74
+ "Wifi", "Horoskop saya", "Penjelajah waktu", "Mesin cuci", "Kulkas saya",
75
+ "Semangat Natal", "Bayangan saya", "Seorang ninja", "Polisi vegan", "Siri",
76
+ "Tanaman karnivora saya", "Kurir Amazon", "Klon jahat saya", "Seorang penyihir", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "telah menyatakan perang terhadap", "telah memakan", "telah menculik", "telah membakar",
80
+ "sedang mengadakan pesta di", "telah muntah di", "menolak untuk meninggalkan",
81
+ "telah meretas", "telah mencuri", "telah jatuh cinta dengan", "sedang merenungkan",
82
+ "telah memberikan mantra pada", "sedang memprotes terhadap", "telah mendirikan aliran sesat di",
83
+ "sedang menari samba di", "telah memanggil iblis di", "telah memblokir akses ke",
84
+ "telah berubah menjadi emas", "sedang mencoba menjual", "telah menulis buku tentang"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "kunci rumah saya.", "keinginan saya untuk hidup.", "pintu garasi.",
88
+ "celana favorit saya.", "router ruang tamu.", "satu-satunya pasang sepatu saya.",
89
+ "hukum fisika.", "martabat saya.", "lift gedung.",
90
+ "akun Netflix saya.", "sikat gigi saya.", "akta rumah saya.",
91
+ "koleksi pogs saya.", "rem tangan mobil.", "keinginan saya untuk bersosialisasi.",
92
+ "persediaan kopi saya.", "tutup toilet.", "remot TV.",
93
+ "kaus kaki keberuntungan saya.", "peradaban Barat."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Referensi'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'Seni Ilmiah dalam Membuat Alasan Sempurna', level: 2 },
100
+ { type: 'paragraph', html: 'Kita hidup di era hiperkoneksi. Ponsel Anda bergetar, jam tangan memberi notifikasi, dan agenda sosial Anda terlihat seperti permainan Tetris yang hampir kalah. Tekanan untuk menyetujui segalanya telah menciptakan epidemi kelelahan sosial.' },
101
+ { type: 'title', text: 'Kebangkitan JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'Meskipun FOMO (Fear of Missing Out) mendominasi dekade terakhir, para pakar kesehatan digital kini menganjurkan <strong>JOMO: Kegembiraan dalam Melewatkan Sesuatu</strong>. Ini bukan tentang isolasi, tetapi tentang intensionalitas.' },
103
+ { type: 'tip', title: 'Formula Alibi yang Tak Terbantahkan', html: '<strong>Subjek yang Terdisosiasi:</strong> Anda tidak pernah menjadi pelakunya. Itu adalah "wifi", "kucing saya", "alam semesta". Alihkan kesalahan ke entitas eksternal.<br><strong>Tindakan Hiperbolik:</strong> Situasinya harus cukup tidak masuk akal atau cukup teknis sehingga tidak ada yang menanyakan detailnya.<br><strong>Blok Fisik:</strong> Hasil akhirnya harus biner: saya pergi atau saya tetap di rumah.' },
104
+ { type: 'title', text: 'Sejarah Singkat Alasan', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Abad Pertengahan:</strong> "Kuda saya kehilangan tapalnya" (Klasik sepanjang masa).',
107
+ '<strong>Revolusi Industri:</strong> "Mesin uapnya terlalu panas".',
108
+ '<strong>Era Digital:</strong> "Internet saya terputus tepat di tengah pembaruan".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Meringankan tekanan sosial secara instan', con: 'Penggunaan berlebihan merusak kepercayaan' },
112
+ { pro: 'Melindungi energi dan batasan Anda', con: 'Dapat menimbulkan rasa bersalah jika digunakan sembarangan' },
113
+ { pro: 'Nada kreatif dan humoris meredakan ketegangan', con: 'Tidak cocok untuk konteks formal atau profesional' },
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 = 'generatore-di-scuse';
6
- const title = 'Generatore di Scuse';
7
- const description = 'Macchina d\'azzardo semantica per liberarsi dagli impegni con stile. Genera istantaneamente scuse surreali e inconfutabili.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Questo generatore può salvare il mio matrimonio?',
12
- answer: 'Pur non essendo terapeuti, evitare quella cena con i suoceri usando un\'emergenza tecnica plausibile può ridurre significativamente la tensione. Usare responsabilmente.'
13
- },
14
- {
15
- question: 'Perché frasi così surreali?',
16
- answer: 'La strategia si basa sulla dissonanza cognitiva. Se dici qualcosa di noioso, è verificabile. Se dici qualcosa di assurdo, la sorpresa blocca la capacità di arrabbiarsi.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Genera', text: 'Clicca sul pulsante genera per creare una nuova scusa.' },
22
- { name: 'Copia', text: 'Clicca sul pulsante copia per portare la scusa negli appunti.' }
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: 'it',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Domande Frequenti',
63
- ui: {
64
- title: 'Generatore di Scuse Surreali',
65
- description: 'Calcolatore di alibi di nuova generazione.',
66
- subjectLabel: 'Soggetto',
67
- actionLabel: 'Azione',
68
- victimLabel: 'Vittima',
69
- generateBtn: 'GENERA SCUSA',
70
- copyBtn: 'Copia questa follia',
71
- copied: 'Copiato!',
72
- starts: JSON.stringify([
73
- "Il mio gatto", "Mia nonna", "Il presidente", "Un alieno", "Il mio vicino del 5° piano",
74
- "Il wifi", "Il mio oroscopo", "Un viaggiatore nel tempo", "La lavatrice", "Il mio frigorifero",
75
- "Lo spirito del Natale", "La mia ombra", "Un ninja", "La polizia vegana", "Siri",
76
- "La mia pianta carnivora", "Il fattorino di Amazon", "Il mio clone cattivo", "Un mago", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "ha dichiarato guerra a", "ha mangiato", "ha rapito", "ha dato fuoco a",
80
- "sta organizzando una festa a", "ha vomitato su", "si rifiuta di lasciare",
81
- "ha hackerato", "ha rubato", "si è innamorato di", "sta meditando su",
82
- "ha lanciato un incantesimo su", "sta protestando contro", "ha fondato una setta a",
83
- "sta ballando il samba a", "ha evocato un demone a", "ha bloccato l'accesso a",
84
- "si è trasformato in oro", "sta cercando di vendere", "ha scritto un libro su"
85
- ]),
86
- ends: JSON.stringify([
87
- "le chiavi di casa mia.", "la mia voglia di vivere.", "la porta del garage.",
88
- "i miei pantaloni preferiti.", "il router del soggiorno.", "il mio unico paio di scarpe.",
89
- "le leggi della fisica.", "la mia dignità.", "l'ascensore del palazzo.",
90
- "il mio account Netflix.", "il mio spazzolino da denti.", "l'atto di proprietà della casa.",
91
- "la mia collezione di pogs.", "il freno a mano dell'auto.", "il mio desiderio di socializzare.",
92
- "la mia scorta di caffè.", "il coperchio della toilette.", "il telecomando della TV.",
93
- "i miei calzini fortunati.", "la civiltà occidentale."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Riferimenti'
97
- },
98
- seo: [
99
- { type: 'title', text: 'L\'arte scientifica della scusa perfetta', level: 2 },
100
- { type: 'paragraph', html: 'Viviamo nell\'era dell\'iperattività. Il telefono vibra, l\'orologio invia notifiche e l\'agenda sociale sembra una partita a Tetris che sta per essere persa. La pressione a dire "sì" a tutto ha creato un\'epidemia di esaurimento sociale.' },
101
- { type: 'title', text: 'La rinascita di JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'Mentre il FOMO (Fear of Missing Out) ha dominato l\'ultimo decennio, gli esperti di benessere digitale ora promuovono la <strong>JOMO: la gioia di perdersi qualcosa</strong>. Non si tratta di isolamento, ma di intenzionalità.' },
103
- { type: 'tip', title: 'La formula per l\'alibi inconfutabile', html: '<strong>Il soggetto dissociato:</strong> non sei mai tu il colpevole. È "il wifi", "il mio gatto", "l\'universo". Sposta la colpa su un\'entità esterna.<br><strong>L\'azione iperbolica:</strong> la situazione deve essere abbastanza assurda o tecnica affinché nessuno chieda i dettagli.<br><strong>Il blocco fisico:</strong> l\'esito finale deve essere binario: o vado o resto a casa.' },
104
- { type: 'title', text: 'Breve storia della scusa', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Medioevo:</strong> "Il mio cavallo ha perso un ferro" (un classico intramontabile).',
107
- '<strong>Rivoluzione industriale:</strong> "La macchina a vapore si è surriscaldata".',
108
- '<strong>Era digitale:</strong> "La connessione è caduta proprio durante l\'aggiornamento".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Allevia istantaneamente la pressione sociale', con: 'L\'uso eccessivo erode la fiducia' },
112
- { pro: 'Protegge la tua energia e i tuoi confini', con: 'Può generare sensi di colpa se usato con noncuranza' },
113
- { pro: 'Il tono creativo e umoristico smorza la tensione', con: 'Non adatto a contesti formali o professionali' },
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 = 'generatore-di-scuse';
6
+ const title = 'Generatore di Scuse';
7
+ const description = 'Macchina d\'azzardo semantica per liberarsi dagli impegni con stile. Genera istantaneamente scuse surreali e inconfutabili.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Questo generatore può salvare il mio matrimonio?',
12
+ answer: 'Pur non essendo terapeuti, evitare quella cena con i suoceri usando un\'emergenza tecnica plausibile può ridurre significativamente la tensione. Usare responsabilmente.'
13
+ },
14
+ {
15
+ question: 'Perché frasi così surreali?',
16
+ answer: 'La strategia si basa sulla dissonanza cognitiva. Se dici qualcosa di noioso, è verificabile. Se dici qualcosa di assurdo, la sorpresa blocca la capacità di arrabbiarsi.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Genera', text: 'Clicca sul pulsante genera per creare una nuova scusa.' },
22
+ { name: 'Copia', text: 'Clicca sul pulsante copia per portare la scusa negli appunti.' }
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: 'it',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Domande Frequenti',
63
+ ui: {
64
+ title: 'Generatore di Scuse Surreali',
65
+ description: 'Calcolatore di alibi di nuova generazione.',
66
+ subjectLabel: 'Soggetto',
67
+ actionLabel: 'Azione',
68
+ victimLabel: 'Vittima',
69
+ generateBtn: 'GENERA SCUSA',
70
+ copyBtn: 'Copia questa follia',
71
+ copied: 'Copiato!',
72
+ starts: JSON.stringify([
73
+ "Il mio gatto", "Mia nonna", "Il presidente", "Un alieno", "Il mio vicino del 5° piano",
74
+ "Il wifi", "Il mio oroscopo", "Un viaggiatore nel tempo", "La lavatrice", "Il mio frigorifero",
75
+ "Lo spirito del Natale", "La mia ombra", "Un ninja", "La polizia vegana", "Siri",
76
+ "La mia pianta carnivora", "Il fattorino di Amazon", "Il mio clone cattivo", "Un mago", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "ha dichiarato guerra a", "ha mangiato", "ha rapito", "ha dato fuoco a",
80
+ "sta organizzando una festa a", "ha vomitato su", "si rifiuta di lasciare",
81
+ "ha hackerato", "ha rubato", "si è innamorato di", "sta meditando su",
82
+ "ha lanciato un incantesimo su", "sta protestando contro", "ha fondato una setta a",
83
+ "sta ballando il samba a", "ha evocato un demone a", "ha bloccato l'accesso a",
84
+ "si è trasformato in oro", "sta cercando di vendere", "ha scritto un libro su"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "le chiavi di casa mia.", "la mia voglia di vivere.", "la porta del garage.",
88
+ "i miei pantaloni preferiti.", "il router del soggiorno.", "il mio unico paio di scarpe.",
89
+ "le leggi della fisica.", "la mia dignità.", "l'ascensore del palazzo.",
90
+ "il mio account Netflix.", "il mio spazzolino da denti.", "l'atto di proprietà della casa.",
91
+ "la mia collezione di pogs.", "il freno a mano dell'auto.", "il mio desiderio di socializzare.",
92
+ "la mia scorta di caffè.", "il coperchio della toilette.", "il telecomando della TV.",
93
+ "i miei calzini fortunati.", "la civiltà occidentale."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Riferimenti'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'L\'arte scientifica della scusa perfetta', level: 2 },
100
+ { type: 'paragraph', html: 'Viviamo nell\'era dell\'iperattività. Il telefono vibra, l\'orologio invia notifiche e l\'agenda sociale sembra una partita a Tetris che sta per essere persa. La pressione a dire "sì" a tutto ha creato un\'epidemia di esaurimento sociale.' },
101
+ { type: 'title', text: 'La rinascita di JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'Mentre il FOMO (Fear of Missing Out) ha dominato l\'ultimo decennio, gli esperti di benessere digitale ora promuovono la <strong>JOMO: la gioia di perdersi qualcosa</strong>. Non si tratta di isolamento, ma di intenzionalità.' },
103
+ { type: 'tip', title: 'La formula per l\'alibi inconfutabile', html: '<strong>Il soggetto dissociato:</strong> non sei mai tu il colpevole. È "il wifi", "il mio gatto", "l\'universo". Sposta la colpa su un\'entità esterna.<br><strong>L\'azione iperbolica:</strong> la situazione deve essere abbastanza assurda o tecnica affinché nessuno chieda i dettagli.<br><strong>Il blocco fisico:</strong> l\'esito finale deve essere binario: o vado o resto a casa.' },
104
+ { type: 'title', text: 'Breve storia della scusa', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Medioevo:</strong> "Il mio cavallo ha perso un ferro" (un classico intramontabile).',
107
+ '<strong>Rivoluzione industriale:</strong> "La macchina a vapore si è surriscaldata".',
108
+ '<strong>Era digitale:</strong> "La connessione è caduta proprio durante l\'aggiornamento".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Allevia istantaneamente la pressione sociale', con: 'L\'uso eccessivo erode la fiducia' },
112
+ { pro: 'Protegge la tua energia e i tuoi confini', con: 'Può generare sensi di colpa se usato con noncuranza' },
113
+ { pro: 'Il tono creativo e umoristico smorza la tensione', con: 'Non adatto a contesti formali o professionali' },
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };