@kaikybrofc/omnizap-system 2.2.10 → 2.3.1

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 (123) hide show
  1. package/README.md +13 -13
  2. package/app/config/adminIdentity.js +1 -3
  3. package/app/connection/socketController.js +10 -20
  4. package/app/controllers/messageController.js +7 -28
  5. package/app/modules/aiModule/catCommand.js +29 -192
  6. package/app/modules/broadcastModule/noticeCommand.js +28 -97
  7. package/app/modules/gameModule/diceCommand.js +6 -32
  8. package/app/modules/playModule/playCommand.js +57 -258
  9. package/app/modules/quoteModule/quoteCommand.js +2 -4
  10. package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1 -13
  11. package/app/modules/statsModule/noMessageCommand.js +16 -84
  12. package/app/modules/statsModule/rankingCommand.js +5 -25
  13. package/app/modules/statsModule/rankingCommon.js +1 -9
  14. package/app/modules/stickerModule/convertToWebp.js +4 -27
  15. package/app/modules/stickerModule/stickerCommand.js +13 -24
  16. package/app/modules/stickerModule/stickerTextCommand.js +13 -25
  17. package/app/modules/stickerPackModule/autoPackCollectorService.js +16 -7
  18. package/app/modules/stickerPackModule/domainEventOutboxRepository.js +20 -36
  19. package/app/modules/stickerPackModule/domainEvents.js +2 -11
  20. package/app/modules/stickerPackModule/semanticReclassificationEngine.js +13 -50
  21. package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +2 -15
  22. package/app/modules/stickerPackModule/semanticThemeClusterService.js +14 -41
  23. package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +25 -95
  24. package/app/modules/stickerPackModule/stickerAssetRepository.js +12 -31
  25. package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +13 -18
  26. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +284 -709
  27. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +27 -106
  28. package/app/modules/stickerPackModule/stickerClassificationService.js +46 -77
  29. package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +13 -53
  30. package/app/modules/stickerPackModule/stickerDomainEventBus.js +10 -16
  31. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +40 -39
  32. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +1 -4
  33. package/app/modules/stickerPackModule/stickerObjectStorageService.js +26 -26
  34. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +32 -187
  35. package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +6 -15
  36. package/app/modules/stickerPackModule/stickerPackItemRepository.js +6 -32
  37. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +12 -36
  38. package/app/modules/stickerPackModule/stickerPackMessageService.js +12 -40
  39. package/app/modules/stickerPackModule/stickerPackRepository.js +23 -66
  40. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +9 -21
  41. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +10 -40
  42. package/app/modules/stickerPackModule/stickerPackService.js +50 -115
  43. package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +2 -21
  44. package/app/modules/stickerPackModule/stickerPackUtils.js +13 -3
  45. package/app/modules/stickerPackModule/stickerStorageService.js +16 -65
  46. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +4 -22
  47. package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +14 -29
  48. package/app/modules/systemMetricsModule/pingCommand.js +9 -39
  49. package/app/modules/tiktokModule/tiktokCommand.js +17 -109
  50. package/app/modules/userModule/userCommand.js +2 -88
  51. package/app/observability/metrics.js +5 -16
  52. package/app/services/captchaService.js +1 -6
  53. package/app/services/dbWriteQueue.js +3 -18
  54. package/app/services/featureFlagService.js +2 -8
  55. package/app/services/newsBroadcastService.js +0 -1
  56. package/app/services/queueUtils.js +2 -4
  57. package/app/services/whatsappLoginLinkService.js +7 -9
  58. package/app/store/premiumUserStore.js +1 -2
  59. package/app/utils/antiLink/antiLinkModule.js +3 -233
  60. package/app/utils/logger/loggerModule.js +9 -34
  61. package/app/utils/systemMetrics/systemMetricsModule.js +1 -4
  62. package/database/index.js +1 -0
  63. package/database/init.js +1 -8
  64. package/database/migrations/20260228_0027_web_visit_event.sql +15 -0
  65. package/docker-compose.yml +27 -27
  66. package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +26 -0
  67. package/docs/seo/satellite-page-template.md +2 -0
  68. package/docs/seo/satellite-pages-phase1.json +40 -177
  69. package/eslint.config.js +2 -15
  70. package/index.js +8 -36
  71. package/ml/clip_classifier/README.md +4 -6
  72. package/observability/alert-rules.yml +12 -12
  73. package/observability/grafana/provisioning/dashboards/dashboards.yml +1 -1
  74. package/package.json +6 -3
  75. package/public/api-docs/index.html +220 -193
  76. package/public/bot-whatsapp-para-grupo/index.html +291 -261
  77. package/public/bot-whatsapp-sem-programar/index.html +291 -261
  78. package/public/comandos/index.html +421 -406
  79. package/public/como-automatizar-avisos-no-whatsapp/index.html +291 -261
  80. package/public/como-criar-comandos-whatsapp/index.html +291 -261
  81. package/public/como-evitar-spam-no-whatsapp/index.html +291 -261
  82. package/public/como-moderar-grupo-whatsapp/index.html +291 -261
  83. package/public/como-organizar-comunidade-whatsapp/index.html +291 -261
  84. package/public/css/github-project-panel.css +13 -8
  85. package/public/css/stickers-admin.css +25 -9
  86. package/public/css/styles.css +23 -16
  87. package/public/index.html +1106 -993
  88. package/public/js/apps/apiDocsApp.js +17 -167
  89. package/public/js/apps/createPackApp.js +69 -332
  90. package/public/js/apps/homeApp.js +274 -101
  91. package/public/js/apps/loginApp.js +3 -12
  92. package/public/js/apps/stickersAdminApp.js +190 -181
  93. package/public/js/apps/stickersApp.js +482 -1411
  94. package/public/js/apps/userApp.js +217 -1
  95. package/public/js/catalog.js +11 -74
  96. package/public/js/github-panel/components/ErrorState.js +1 -8
  97. package/public/js/github-panel/components/GithubProjectPanel.js +2 -9
  98. package/public/js/github-panel/components/SkeletonPanel.js +1 -11
  99. package/public/js/github-panel/components/StatCard.js +1 -7
  100. package/public/js/github-panel/vendor/react.js +1 -9
  101. package/public/js/runtime/react-runtime.js +1 -9
  102. package/public/licenca/index.html +200 -86
  103. package/public/login/index.html +315 -325
  104. package/public/melhor-bot-whatsapp-para-grupos/index.html +291 -261
  105. package/public/stickers/admin/index.html +14 -19
  106. package/public/stickers/create/index.html +39 -44
  107. package/public/stickers/index.html +96 -107
  108. package/public/termos-de-uso/index.html +369 -122
  109. package/public/user/index.html +527 -350
  110. package/scripts/cache-bust.mjs +5 -24
  111. package/scripts/generate-seo-satellite-pages.mjs +10 -13
  112. package/scripts/run-prettier-all.mjs +25 -0
  113. package/scripts/sticker-catalog-loadtest.mjs +13 -11
  114. package/scripts/sticker-worker-task.mjs +1 -4
  115. package/scripts/sync-readme-snapshot.mjs +3 -2
  116. package/server/auth/googleWebAuth/googleWebAuthService.js +614 -0
  117. package/server/controllers/stickerCatalogController.js +297 -632
  118. package/server/http/httpServer.js +2 -10
  119. package/server/routes/stickerCatalog/catalogHandlers/catalogAdminHttp.js +1 -8
  120. package/server/routes/stickerCatalog/catalogHandlers/catalogAuthHttp.js +1 -9
  121. package/server/routes/stickerCatalog/catalogHandlers/catalogPublicHttp.js +10 -11
  122. package/server/routes/stickerCatalog/catalogHandlers/catalogUploadHttp.js +1 -10
  123. package/server/routes/stickerCatalog/catalogRouter.js +11 -13
@@ -1,224 +1,254 @@
1
1
  <!doctype html>
2
2
  <html lang="pt-BR">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Como moderar grupo no WhatsApp com bot | Guia pratico</title>
7
- <meta name="description" content="Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva." />
8
- <meta name="keywords" content="como moderar grupo whatsapp, bot para moderar grupo, organizacao de grupo whatsapp" />
9
- <meta name="robots" content="index, follow" />
10
- <link rel="canonical" href="https://omnizap.shop/como-moderar-grupo-whatsapp/" />
11
- <link rel="icon" type="image/png" href="/assets/images/brand-icon-192.png" />
12
-
13
- <meta property="og:type" content="article" />
14
- <meta property="og:locale" content="pt_BR" />
15
- <meta property="og:site_name" content="OmniZap System" />
16
- <meta property="og:title" content="Como moderar grupo no WhatsApp com bot | Guia pratico" />
17
- <meta property="og:description" content="Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva." />
18
- <meta property="og:url" content="https://omnizap.shop/como-moderar-grupo-whatsapp/" />
19
- <meta property="og:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
20
-
21
- <meta name="twitter:card" content="summary_large_image" />
22
- <meta name="twitter:title" content="Como moderar grupo no WhatsApp com bot | Guia pratico" />
23
- <meta name="twitter:description" content="Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva." />
24
- <meta name="twitter:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
25
-
26
- <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Como moderar grupo no WhatsApp com bot | Guia pratico","description":"Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva.","inLanguage":"pt-BR","url":"https://omnizap.shop/como-moderar-grupo-whatsapp/","isPartOf":{"@type":"WebSite","name":"OmniZap System","url":"https://omnizap.shop"}}</script>
27
- <script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Da para moderar grupo sem ficar online o tempo todo?","acceptedAnswer":{"@type":"Answer","text":"Sim. O bot executa regras automaticas e reduz a dependencia de moderacao manual constante."}},{"@type":"Question","name":"Posso combinar moderacao e avisos automaticos?","acceptedAnswer":{"@type":"Answer","text":"Sim. Essa combinacao costuma ser o melhor ponto de partida para grupos em crescimento."}},{"@type":"Question","name":"Onde vejo recursos tecnicos avancados?","acceptedAnswer":{"@type":"Answer","text":"A documentacao de integracao esta em /api-docs/."}}]}</script>
28
-
29
- <style>
30
- :root {
31
- --bg: #0f172a;
32
- --bg-2: #111827;
33
- --line: rgba(255, 255, 255, 0.05);
34
- --text: #f8fafc;
35
- --muted: #94a3b8;
36
- --card: #1e293bd9;
37
- --accent: #2563eb;
38
- --accent-2: #7c3aed;
39
- --cta: #22c55e;
40
- --cta-hover: #16a34a;
41
- }
42
-
43
- * { box-sizing: border-box; }
44
- body {
45
- margin: 0;
46
- font-family: "Manrope", system-ui, -apple-system, sans-serif;
47
- color: var(--text);
48
- background:
49
- radial-gradient(58rem 22rem at -10% -8%, #2563eb24, transparent 60%),
50
- radial-gradient(62rem 26rem at 112% -12%, #7c3aed22, transparent 58%),
51
- linear-gradient(165deg, var(--bg), var(--bg-2));
52
- }
53
-
54
- .wrap { width: min(980px, 92vw); margin: 0 auto; padding: 22px 0 42px; }
55
-
56
- .top {
57
- display: flex;
58
- flex-wrap: wrap;
59
- gap: 8px;
60
- margin-bottom: 14px;
61
- }
62
-
63
- .top a {
64
- color: var(--text);
65
- text-decoration: none;
66
- border: 1px solid var(--line);
67
- border-radius: 10px;
68
- padding: 8px 11px;
69
- background: #111827;
70
- font-size: 14px;
71
- font-weight: 700;
72
- }
73
-
74
- .hero,
75
- .card {
76
- border: 1px solid rgba(255, 255, 255, 0.05);
77
- border-radius: 16px;
78
- background: var(--card);
79
- padding: 16px;
80
- margin-bottom: 12px;
81
- }
82
-
83
- .pill {
84
- display: inline-flex;
85
- border: 1px solid #45689f;
86
- border-radius: 999px;
87
- padding: 5px 10px;
88
- font-size: 12px;
89
- font-weight: 800;
90
- text-transform: uppercase;
91
- letter-spacing: .3px;
92
- color: #cde4ff;
93
- background: #16274a96;
94
- margin-bottom: 10px;
95
- }
96
-
97
- h1, h2 {
98
- margin: 0 0 8px;
99
- font-family: "Sora", "Manrope", sans-serif;
100
- letter-spacing: -0.02em;
101
- }
102
-
103
- h1 {
104
- font-size: clamp(29px, 4vw, 42px);
105
- line-height: 1.08;
106
- background: linear-gradient(92deg, #f3f8ff 0%, #60a5fa 45%, #a78bfa 100%);
107
- -webkit-background-clip: text;
108
- background-clip: text;
109
- color: transparent;
110
- }
111
-
112
- h2 { font-size: clamp(22px, 2.8vw, 30px); }
113
-
114
- p, li {
115
- margin: 0 0 10px;
116
- color: var(--muted);
117
- line-height: 1.65;
118
- font-size: 16px;
119
- }
120
-
121
- ul { margin: 0; padding-left: 18px; }
122
-
123
- .cta {
124
- display: flex;
125
- flex-wrap: wrap;
126
- gap: 8px;
127
- margin-top: 12px;
128
- }
129
-
130
- .btn {
131
- text-decoration: none;
132
- border: 1px solid rgba(255, 255, 255, 0.05);
133
- border-radius: 11px;
134
- padding: 10px 13px;
135
- color: var(--text);
136
- background: #111827;
137
- font-weight: 800;
138
- font-size: 14px;
139
- }
140
-
141
- .btn.primary {
142
- border-color: transparent;
143
- color: #0f172a;
144
- background: var(--cta);
145
- }
146
-
147
- .btn.primary:hover { background: var(--cta-hover); }
148
-
149
- .faq-list {
150
- display: grid;
151
- gap: 9px;
152
- }
153
-
154
- .faq-item {
155
- border: 1px solid rgba(255, 255, 255, 0.05);
156
- border-radius: 12px;
157
- background: #1e293bb8;
158
- padding: 0 12px;
159
- }
160
-
161
- .faq-item summary {
162
- cursor: pointer;
163
- list-style: none;
164
- font-weight: 800;
165
- color: #ebf4ff;
166
- padding: 12px 0;
167
- }
168
-
169
- .faq-item summary::-webkit-details-marker { display: none; }
170
-
171
- .faq-item p {
172
- margin: 0;
173
- padding: 0 0 12px;
174
- font-size: 15px;
175
- }
176
-
177
- .links-grid {
178
- display: grid;
179
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
180
- gap: 8px;
181
- }
182
-
183
- .links-grid a {
184
- text-decoration: none;
185
- color: #dbecff;
186
- border: 1px solid #365686;
187
- border-radius: 10px;
188
- padding: 9px 10px;
189
- background: #10203d;
190
- font-weight: 700;
191
- }
192
-
193
- .meta {
194
- margin-top: 8px;
195
- font-size: 13px;
196
- color: #95b2d8;
197
- }
198
- </style>
199
- </head>
200
- <body>
201
- <main class="wrap">
202
- <nav class="top" aria-label="Navegação interna">
203
- <a href="/">Início</a>
204
- <a href="/stickers/">Stickers</a>
205
- <a href="/api-docs/">API Docs</a>
206
- <a href="/login/">Adicionar Bot</a>
207
- </nav>
208
-
209
- <header class="hero">
210
- <span class="pill">Guia de dor</span>
211
- <h1>Como moderar grupo no WhatsApp sem sobrecarga</h1>
212
- <p>Moderacao manual funciona no inicio, mas quebra quando o grupo cresce. O caminho mais eficiente e automatizar regras basicas com um bot pronto.</p>
213
- <div class="cta">
214
- <a class="btn primary" href="/login/">Adicionar ao meu grupo</a>
215
- <a class="btn" href="/">Conhecer OmniZap</a>
216
- </div>
217
- <p class="meta">Página atualizada em 2026-02-28</p>
218
- </header>
219
-
220
- <section class="card">
221
- <h2>Problemas comuns em grupos sem moderacao</h2>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Como moderar grupo no WhatsApp com bot | Guia pratico</title>
7
+ <meta name="description" content="Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva." />
8
+ <meta name="keywords" content="como moderar grupo whatsapp, bot para moderar grupo, organizacao de grupo whatsapp" />
9
+ <meta name="robots" content="index, follow" />
10
+ <link rel="canonical" href="https://omnizap.shop/como-moderar-grupo-whatsapp/" />
11
+ <link rel="icon" type="image/png" href="/assets/images/brand-icon-192.png" />
12
+
13
+ <meta property="og:type" content="article" />
14
+ <meta property="og:locale" content="pt_BR" />
15
+ <meta property="og:site_name" content="OmniZap System" />
16
+ <meta property="og:title" content="Como moderar grupo no WhatsApp com bot | Guia pratico" />
17
+ <meta property="og:description" content="Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva." />
18
+ <meta property="og:url" content="https://omnizap.shop/como-moderar-grupo-whatsapp/" />
19
+ <meta property="og:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
20
+
21
+ <meta name="twitter:card" content="summary_large_image" />
22
+ <meta name="twitter:title" content="Como moderar grupo no WhatsApp com bot | Guia pratico" />
23
+ <meta name="twitter:description" content="Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva." />
24
+ <meta name="twitter:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
25
+
26
+ <script type="application/ld+json">
27
+ { "@context": "https://schema.org", "@type": "WebPage", "name": "Como moderar grupo no WhatsApp com bot | Guia pratico", "description": "Aprenda como moderar grupo no WhatsApp com menos trabalho manual. Use bot pronto para bloquear spam, organizar regras e manter conversa produtiva.", "inLanguage": "pt-BR", "url": "https://omnizap.shop/como-moderar-grupo-whatsapp/", "isPartOf": { "@type": "WebSite", "name": "OmniZap System", "url": "https://omnizap.shop" } }
28
+ </script>
29
+ <script type="application/ld+json">
30
+ {
31
+ "@context": "https://schema.org",
32
+ "@type": "FAQPage",
33
+ "mainEntity": [
34
+ { "@type": "Question", "name": "Da para moderar grupo sem ficar online o tempo todo?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. O bot executa regras automaticas e reduz a dependencia de moderacao manual constante." } },
35
+ { "@type": "Question", "name": "Posso combinar moderacao e avisos automaticos?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. Essa combinacao costuma ser o melhor ponto de partida para grupos em crescimento." } },
36
+ { "@type": "Question", "name": "Onde vejo recursos tecnicos avancados?", "acceptedAnswer": { "@type": "Answer", "text": "A documentacao de integracao esta em /api-docs/." } }
37
+ ]
38
+ }
39
+ </script>
40
+
41
+ <style>
42
+ :root {
43
+ --bg: #0f172a;
44
+ --bg-2: #111827;
45
+ --line: rgba(255, 255, 255, 0.05);
46
+ --text: #f8fafc;
47
+ --muted: #94a3b8;
48
+ --card: #1e293bd9;
49
+ --accent: #2563eb;
50
+ --accent-2: #7c3aed;
51
+ --cta: #22c55e;
52
+ --cta-hover: #16a34a;
53
+ }
54
+
55
+ * {
56
+ box-sizing: border-box;
57
+ }
58
+ body {
59
+ margin: 0;
60
+ font-family:
61
+ 'Manrope',
62
+ system-ui,
63
+ -apple-system,
64
+ sans-serif;
65
+ color: var(--text);
66
+ background: radial-gradient(58rem 22rem at -10% -8%, #2563eb24, transparent 60%), radial-gradient(62rem 26rem at 112% -12%, #7c3aed22, transparent 58%), linear-gradient(165deg, var(--bg), var(--bg-2));
67
+ }
68
+
69
+ .wrap {
70
+ width: min(980px, 92vw);
71
+ margin: 0 auto;
72
+ padding: 22px 0 42px;
73
+ }
74
+
75
+ .top {
76
+ display: flex;
77
+ flex-wrap: wrap;
78
+ gap: 8px;
79
+ margin-bottom: 14px;
80
+ }
81
+
82
+ .top a {
83
+ color: var(--text);
84
+ text-decoration: none;
85
+ border: 1px solid var(--line);
86
+ border-radius: 10px;
87
+ padding: 8px 11px;
88
+ background: #111827;
89
+ font-size: 14px;
90
+ font-weight: 700;
91
+ }
92
+
93
+ .hero,
94
+ .card {
95
+ border: 1px solid rgba(255, 255, 255, 0.05);
96
+ border-radius: 16px;
97
+ background: var(--card);
98
+ padding: 16px;
99
+ margin-bottom: 12px;
100
+ }
101
+
102
+ .pill {
103
+ display: inline-flex;
104
+ border: 1px solid #45689f;
105
+ border-radius: 999px;
106
+ padding: 5px 10px;
107
+ font-size: 12px;
108
+ font-weight: 800;
109
+ text-transform: uppercase;
110
+ letter-spacing: 0.3px;
111
+ color: #cde4ff;
112
+ background: #16274a96;
113
+ margin-bottom: 10px;
114
+ }
115
+
116
+ h1,
117
+ h2 {
118
+ margin: 0 0 8px;
119
+ font-family: 'Sora', 'Manrope', sans-serif;
120
+ letter-spacing: -0.02em;
121
+ }
122
+
123
+ h1 {
124
+ font-size: clamp(29px, 4vw, 42px);
125
+ line-height: 1.08;
126
+ background: linear-gradient(92deg, #f3f8ff 0%, #60a5fa 45%, #a78bfa 100%);
127
+ -webkit-background-clip: text;
128
+ background-clip: text;
129
+ color: transparent;
130
+ }
131
+
132
+ h2 {
133
+ font-size: clamp(22px, 2.8vw, 30px);
134
+ }
135
+
136
+ p,
137
+ li {
138
+ margin: 0 0 10px;
139
+ color: var(--muted);
140
+ line-height: 1.65;
141
+ font-size: 16px;
142
+ }
143
+
144
+ ul {
145
+ margin: 0;
146
+ padding-left: 18px;
147
+ }
148
+
149
+ .cta {
150
+ display: flex;
151
+ flex-wrap: wrap;
152
+ gap: 8px;
153
+ margin-top: 12px;
154
+ }
155
+
156
+ .btn {
157
+ text-decoration: none;
158
+ border: 1px solid rgba(255, 255, 255, 0.05);
159
+ border-radius: 11px;
160
+ padding: 10px 13px;
161
+ color: var(--text);
162
+ background: #111827;
163
+ font-weight: 800;
164
+ font-size: 14px;
165
+ }
166
+
167
+ .btn.primary {
168
+ border-color: transparent;
169
+ color: #0f172a;
170
+ background: var(--cta);
171
+ }
172
+
173
+ .btn.primary:hover {
174
+ background: var(--cta-hover);
175
+ }
176
+
177
+ .faq-list {
178
+ display: grid;
179
+ gap: 9px;
180
+ }
181
+
182
+ .faq-item {
183
+ border: 1px solid rgba(255, 255, 255, 0.05);
184
+ border-radius: 12px;
185
+ background: #1e293bb8;
186
+ padding: 0 12px;
187
+ }
188
+
189
+ .faq-item summary {
190
+ cursor: pointer;
191
+ list-style: none;
192
+ font-weight: 800;
193
+ color: #ebf4ff;
194
+ padding: 12px 0;
195
+ }
196
+
197
+ .faq-item summary::-webkit-details-marker {
198
+ display: none;
199
+ }
200
+
201
+ .faq-item p {
202
+ margin: 0;
203
+ padding: 0 0 12px;
204
+ font-size: 15px;
205
+ }
206
+
207
+ .links-grid {
208
+ display: grid;
209
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
210
+ gap: 8px;
211
+ }
212
+
213
+ .links-grid a {
214
+ text-decoration: none;
215
+ color: #dbecff;
216
+ border: 1px solid #365686;
217
+ border-radius: 10px;
218
+ padding: 9px 10px;
219
+ background: #10203d;
220
+ font-weight: 700;
221
+ }
222
+
223
+ .meta {
224
+ margin-top: 8px;
225
+ font-size: 13px;
226
+ color: #95b2d8;
227
+ }
228
+ </style>
229
+ </head>
230
+ <body>
231
+ <main class="wrap">
232
+ <nav class="top" aria-label="Navegação interna">
233
+ <a href="/">Início</a>
234
+ <a href="/stickers/">Stickers</a>
235
+ <a href="/api-docs/">API Docs</a>
236
+ <a href="/login/">Adicionar Bot</a>
237
+ </nav>
238
+
239
+ <header class="hero">
240
+ <span class="pill">Guia de dor</span>
241
+ <h1>Como moderar grupo no WhatsApp sem sobrecarga</h1>
242
+ <p>Moderacao manual funciona no inicio, mas quebra quando o grupo cresce. O caminho mais eficiente e automatizar regras basicas com um bot pronto.</p>
243
+ <div class="cta">
244
+ <a class="btn primary" href="/login/">Adicionar ao meu grupo</a>
245
+ <a class="btn" href="/">Conhecer OmniZap</a>
246
+ </div>
247
+ <p class="meta">Página atualizada em 2026-02-28</p>
248
+ </header>
249
+
250
+ <section class="card">
251
+ <h2>Problemas comuns em grupos sem moderacao</h2>
222
252
  <p>Quando nao existe rotina de moderacao, o grupo perde foco rapido.</p>
223
253
  <p>Mensagem fora de contexto, links em excesso e repeticao de conflitos viram padrao.</p>
224
254
  <ul>
@@ -226,51 +256,51 @@
226
256
  <li>Perguntas repetidas sem resposta padrao</li>
227
257
  <li>Administrador sobrecarregado</li>
228
258
  </ul>
229
- </section>
259
+ </section>
230
260
 
231
- <section class="card">
232
- <h2>O que automatizar primeiro</h2>
261
+ <section class="card">
262
+ <h2>O que automatizar primeiro</h2>
233
263
  <p>Comece por regras simples: aviso de boas-vindas, lembrete de regras e bloqueio de comportamento abusivo.</p>
234
264
  <p>Esses tres pontos ja elevam a qualidade do grupo sem aumentar custo operacional.</p>
235
- </section>
265
+ </section>
236
266
 
237
- <section class="card">
238
- <h2>Moderacao com previsibilidade</h2>
267
+ <section class="card">
268
+ <h2>Moderacao com previsibilidade</h2>
239
269
  <p>Com o bot ativo, voce cria padrao de operacao para o grupo.</p>
240
270
  <p>Isso reduz desgaste da equipe e melhora a experiencia de quem participa.</p>
241
- </section>
242
-
243
- <section class="card">
244
- <h2>Perguntas frequentes</h2>
245
- <div class="faq-list">
246
- <details class="faq-item">
247
- <summary>Da para moderar grupo sem ficar online o tempo todo?</summary>
248
- <p>Sim. O bot executa regras automaticas e reduz a dependencia de moderacao manual constante.</p>
249
- </details>
250
- <details class="faq-item">
251
- <summary>Posso combinar moderacao e avisos automaticos?</summary>
252
- <p>Sim. Essa combinacao costuma ser o melhor ponto de partida para grupos em crescimento.</p>
253
- </details>
254
- <details class="faq-item">
255
- <summary>Onde vejo recursos tecnicos avancados?</summary>
256
- <p>A documentacao de integracao esta em /api-docs/.</p>
257
- </details>
258
- </div>
259
- </section>
260
-
261
- <section class="card">
262
- <h2>Links úteis</h2>
263
- <div class="links-grid">
264
- <a href="/">OmniZap Home</a>
265
- <a href="/stickers/">Catálogo de Stickers</a>
266
- <a href="/comandos/">Biblioteca de Comandos</a>
267
- <a href="/api-docs/">Área de Desenvolvedor</a>
268
- <a href="/login/">Adicionar bot agora</a>
269
- <a href="/como-evitar-spam-no-whatsapp/">Como evitar spam no WhatsApp</a>
270
- <a href="/como-organizar-comunidade-whatsapp/">Como organizar comunidade no WhatsApp</a>
271
- <a href="/bot-whatsapp-para-grupo/">Bot para grupo de WhatsApp</a>
272
- </div>
273
- </section>
274
- </main>
275
- </body>
276
- </html>
271
+ </section>
272
+
273
+ <section class="card">
274
+ <h2>Perguntas frequentes</h2>
275
+ <div class="faq-list">
276
+ <details class="faq-item">
277
+ <summary>Da para moderar grupo sem ficar online o tempo todo?</summary>
278
+ <p>Sim. O bot executa regras automaticas e reduz a dependencia de moderacao manual constante.</p>
279
+ </details>
280
+ <details class="faq-item">
281
+ <summary>Posso combinar moderacao e avisos automaticos?</summary>
282
+ <p>Sim. Essa combinacao costuma ser o melhor ponto de partida para grupos em crescimento.</p>
283
+ </details>
284
+ <details class="faq-item">
285
+ <summary>Onde vejo recursos tecnicos avancados?</summary>
286
+ <p>A documentacao de integracao esta em /api-docs/.</p>
287
+ </details>
288
+ </div>
289
+ </section>
290
+
291
+ <section class="card">
292
+ <h2>Links úteis</h2>
293
+ <div class="links-grid">
294
+ <a href="/">OmniZap Home</a>
295
+ <a href="/stickers/">Catálogo de Stickers</a>
296
+ <a href="/comandos/">Biblioteca de Comandos</a>
297
+ <a href="/api-docs/">Área de Desenvolvedor</a>
298
+ <a href="/login/">Adicionar bot agora</a>
299
+ <a href="/como-evitar-spam-no-whatsapp/">Como evitar spam no WhatsApp</a>
300
+ <a href="/como-organizar-comunidade-whatsapp/">Como organizar comunidade no WhatsApp</a>
301
+ <a href="/bot-whatsapp-para-grupo/">Bot para grupo de WhatsApp</a>
302
+ </div>
303
+ </section>
304
+ </main>
305
+ </body>
306
+ </html>