@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,230 +1,260 @@
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 automatizar avisos no WhatsApp | Guia rapido</title>
7
- <meta name="description" content="Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao." />
8
- <meta name="keywords" content="automatizar avisos whatsapp, lembrete automatico whatsapp, bot para avisos" />
9
- <meta name="robots" content="index, follow" />
10
- <link rel="canonical" href="https://omnizap.shop/como-automatizar-avisos-no-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 automatizar avisos no WhatsApp | Guia rapido" />
17
- <meta property="og:description" content="Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao." />
18
- <meta property="og:url" content="https://omnizap.shop/como-automatizar-avisos-no-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 automatizar avisos no WhatsApp | Guia rapido" />
23
- <meta name="twitter:description" content="Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao." />
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 automatizar avisos no WhatsApp | Guia rapido","description":"Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao.","inLanguage":"pt-BR","url":"https://omnizap.shop/como-automatizar-avisos-no-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":"Automatizar aviso deixa o grupo robotizado?","acceptedAnswer":{"@type":"Answer","text":"Nao. A ideia e automatizar o repetitivo e liberar tempo para interacao humana de qualidade."}},{"@type":"Question","name":"Posso combinar avisos com moderacao?","acceptedAnswer":{"@type":"Answer","text":"Sim. Essa combinacao e recomendada para grupos ativos."}},{"@type":"Question","name":"Existe modo avancado para integracao tecnica?","acceptedAnswer":{"@type":"Answer","text":"Sim. A documentacao para cenarios avancados 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 automacao</span>
211
- <h1>Como automatizar avisos no WhatsApp sem esquecer recados</h1>
212
- <p>Avisos manuais dependem de memoria e disponibilidade. Com automacao, o grupo recebe recados importantes no horario certo, todos os dias.</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>Quando avisos automaticos fazem diferenca</h2>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Como automatizar avisos no WhatsApp | Guia rapido</title>
7
+ <meta name="description" content="Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao." />
8
+ <meta name="keywords" content="automatizar avisos whatsapp, lembrete automatico whatsapp, bot para avisos" />
9
+ <meta name="robots" content="index, follow" />
10
+ <link rel="canonical" href="https://omnizap.shop/como-automatizar-avisos-no-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 automatizar avisos no WhatsApp | Guia rapido" />
17
+ <meta property="og:description" content="Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao." />
18
+ <meta property="og:url" content="https://omnizap.shop/como-automatizar-avisos-no-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 automatizar avisos no WhatsApp | Guia rapido" />
23
+ <meta name="twitter:description" content="Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao." />
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 automatizar avisos no WhatsApp | Guia rapido", "description": "Aprenda como automatizar avisos no WhatsApp para grupos e comunidades. Envie lembretes com consistencia e reduza falhas de comunicacao.", "inLanguage": "pt-BR", "url": "https://omnizap.shop/como-automatizar-avisos-no-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": "Automatizar aviso deixa o grupo robotizado?", "acceptedAnswer": { "@type": "Answer", "text": "Nao. A ideia e automatizar o repetitivo e liberar tempo para interacao humana de qualidade." } },
35
+ { "@type": "Question", "name": "Posso combinar avisos com moderacao?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. Essa combinacao e recomendada para grupos ativos." } },
36
+ { "@type": "Question", "name": "Existe modo avancado para integracao tecnica?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. A documentacao para cenarios avancados 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 automacao</span>
241
+ <h1>Como automatizar avisos no WhatsApp sem esquecer recados</h1>
242
+ <p>Avisos manuais dependem de memoria e disponibilidade. Com automacao, o grupo recebe recados importantes no horario certo, todos os dias.</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>Quando avisos automaticos fazem diferenca</h2>
222
252
  <p>Reunioes, eventos, prazos e lembretes recorrentes sao casos classicos.</p>
223
253
  <p>A automacao evita falha humana e melhora a confianca do grupo na comunicacao.</p>
224
- </section>
254
+ </section>
225
255
 
226
- <section class="card">
227
- <h2>Modelo simples para comecar</h2>
256
+ <section class="card">
257
+ <h2>Modelo simples para comecar</h2>
228
258
  <p>Defina os avisos que mais se repetem e padronize mensagem e frequencia.</p>
229
259
  <p>Com bot pronto, esse fluxo roda sem precisar montar infraestrutura propria.</p>
230
260
  <ul>
@@ -232,45 +262,45 @@
232
262
  <li>Lembretes antes de eventos</li>
233
263
  <li>Avisos fixos para novos membros</li>
234
264
  </ul>
235
- </section>
265
+ </section>
236
266
 
237
- <section class="card">
238
- <h2>Ganhos para admins e membros</h2>
267
+ <section class="card">
268
+ <h2>Ganhos para admins e membros</h2>
239
269
  <p>Admin ganha tempo para tarefas estrategicas.</p>
240
270
  <p>Membros recebem informacao no momento certo, com menos retrabalho.</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>Automatizar aviso deixa o grupo robotizado?</summary>
248
- <p>Nao. A ideia e automatizar o repetitivo e liberar tempo para interacao humana de qualidade.</p>
249
- </details>
250
- <details class="faq-item">
251
- <summary>Posso combinar avisos com moderacao?</summary>
252
- <p>Sim. Essa combinacao e recomendada para grupos ativos.</p>
253
- </details>
254
- <details class="faq-item">
255
- <summary>Existe modo avancado para integracao tecnica?</summary>
256
- <p>Sim. A documentacao para cenarios avancados 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-organizar-comunidade-whatsapp/">Organizar comunidade no WhatsApp</a>
270
- <a href="/como-evitar-spam-no-whatsapp/">Evitar spam no WhatsApp</a>
271
- <a href="/bot-whatsapp-sem-programar/">Bot sem programar</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>Automatizar aviso deixa o grupo robotizado?</summary>
278
+ <p>Nao. A ideia e automatizar o repetitivo e liberar tempo para interacao humana de qualidade.</p>
279
+ </details>
280
+ <details class="faq-item">
281
+ <summary>Posso combinar avisos com moderacao?</summary>
282
+ <p>Sim. Essa combinacao e recomendada para grupos ativos.</p>
283
+ </details>
284
+ <details class="faq-item">
285
+ <summary>Existe modo avancado para integracao tecnica?</summary>
286
+ <p>Sim. A documentacao para cenarios avancados 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-organizar-comunidade-whatsapp/">Organizar comunidade no WhatsApp</a>
300
+ <a href="/como-evitar-spam-no-whatsapp/">Evitar spam no WhatsApp</a>
301
+ <a href="/bot-whatsapp-sem-programar/">Bot sem programar</a>
302
+ </div>
303
+ </section>
304
+ </main>
305
+ </body>
306
+ </html>