@omnizap-system/omnizap 2.6.0 → 2.6.2

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 (261) hide show
  1. package/.env.example +58 -13
  2. package/.github/workflows/ci.yml +5 -5
  3. package/.github/workflows/codeql.yml +1 -1
  4. package/.github/workflows/db-migration-check.yml +2 -2
  5. package/.github/workflows/dependency-review.yml +1 -1
  6. package/.github/workflows/deploy.yml +2 -2
  7. package/.github/workflows/release.yml +2 -2
  8. package/.github/workflows/security-attest-provenance.yml +2 -2
  9. package/.github/workflows/security-gitleaks.yml +13 -4
  10. package/.github/workflows/security-runner-hardening.yml +2 -2
  11. package/.github/workflows/security-scorecard.yml +1 -1
  12. package/.github/workflows/security-zap-baseline.yml +1 -1
  13. package/.github/workflows/security-zap-full-scan.yml +2 -1
  14. package/.github/workflows/security-zizmor.yml +1 -1
  15. package/.github/workflows/wiki-sync.yml +1 -1
  16. package/.gitleaksignore +9 -0
  17. package/CODE_OF_CONDUCT.md +2 -2
  18. package/GEMINI.md +64 -0
  19. package/README.md +52 -82
  20. package/SECURITY.md +1 -1
  21. package/app/config/index.js +2 -0
  22. package/app/configParts/adminIdentity.js +5 -5
  23. package/app/configParts/baileysConfig.js +230 -58
  24. package/app/configParts/groupUtils.js +5 -0
  25. package/app/configParts/messagePersistenceService.js +145 -4
  26. package/app/configParts/sessionConfig.js +157 -0
  27. package/app/connection/baileysCompatibility.test.js +1 -1
  28. package/app/connection/groupOwnerWriteStateResolver.js +109 -0
  29. package/app/connection/socketController.js +660 -158
  30. package/app/connection/socketController.multiSession.test.js +108 -0
  31. package/app/controllers/messageController.js +1 -1
  32. package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
  33. package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
  34. package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
  35. package/app/controllers/messagePipeline/preProcessingMiddlewares.js +80 -2
  36. package/app/controllers/messageProcessingPipeline.js +93 -13
  37. package/app/controllers/messageProcessingPipeline.test.js +200 -0
  38. package/app/modules/adminModule/AGENT.md +1 -1
  39. package/app/modules/adminModule/commandConfig.json +3318 -1347
  40. package/app/modules/adminModule/groupCommandHandlers.js +858 -15
  41. package/app/modules/adminModule/groupCommandHandlers.test.js +378 -11
  42. package/app/modules/adminModule/groupWarningRepository.js +152 -0
  43. package/app/modules/aiModule/AGENT.md +47 -30
  44. package/app/modules/aiModule/aiConfigRuntime.js +1 -0
  45. package/app/modules/aiModule/catCommand.js +135 -27
  46. package/app/modules/aiModule/commandConfig.json +114 -28
  47. package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
  48. package/app/modules/gameModule/AGENT.md +1 -1
  49. package/app/modules/gameModule/commandConfig.json +29 -0
  50. package/app/modules/menuModule/AGENT.md +1 -1
  51. package/app/modules/menuModule/commandConfig.json +45 -10
  52. package/app/modules/menuModule/menuCatalogService.js +190 -0
  53. package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
  54. package/app/modules/menuModule/menuDynamicService.js +511 -0
  55. package/app/modules/menuModule/menuDynamicService.test.js +141 -0
  56. package/app/modules/menuModule/menus.js +36 -5
  57. package/app/modules/playModule/AGENT.md +10 -5
  58. package/app/modules/playModule/commandConfig.json +140 -12
  59. package/app/modules/playModule/playCommand.js +1 -1417
  60. package/app/modules/playModule/playCommandConstants.js +80 -0
  61. package/app/modules/playModule/playCommandCore.js +361 -0
  62. package/app/modules/playModule/playCommandHandlers.js +41 -0
  63. package/app/modules/playModule/playCommandMediaClient.js +1872 -0
  64. package/app/modules/playModule/playConfigRuntime.js +245 -4
  65. package/app/modules/playModule/playModuleCriticalFlows.test.js +152 -0
  66. package/app/modules/quoteModule/AGENT.md +1 -1
  67. package/app/modules/quoteModule/commandConfig.json +29 -0
  68. package/app/modules/quoteModule/quoteCommand.js +3 -2
  69. package/app/modules/rpgPokemonModule/AGENT.md +1 -1
  70. package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
  71. package/app/modules/rpgPokemonModule/rpgBattleCanvasRenderer.js +5 -4
  72. package/app/modules/rpgPokemonModule/rpgBattleService.test.js +2 -1
  73. package/app/modules/rpgPokemonModule/rpgPokemonDomain.js +2 -1
  74. package/app/modules/rpgPokemonModule/rpgPokemonService.js +38 -37
  75. package/app/modules/rpgPokemonModule/rpgProfileCanvasRenderer.js +4 -3
  76. package/app/modules/statsModule/AGENT.md +1 -1
  77. package/app/modules/statsModule/commandConfig.json +58 -0
  78. package/app/modules/statsModule/rankingCommon.js +5 -4
  79. package/app/modules/stickerModule/AGENT.md +1 -1
  80. package/app/modules/stickerModule/addStickerMetadata.js +4 -3
  81. package/app/modules/stickerModule/commandConfig.json +145 -0
  82. package/app/modules/stickerModule/stickerCommand.js +1 -1
  83. package/app/modules/stickerPackModule/AGENT.md +1 -1
  84. package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
  85. package/app/modules/stickerPackModule/commandConfig.json +29 -0
  86. package/app/modules/stickerPackModule/semanticThemeClusterService.js +7 -6
  87. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +10 -9
  88. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +9 -8
  89. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +3 -2
  90. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +2 -1
  91. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +80 -58
  92. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +2 -1
  93. package/app/modules/stickerPackModule/stickerPackRepository.js +2 -1
  94. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +5 -4
  95. package/app/modules/stickerPackModule/stickerPackService.js +13 -6
  96. package/app/modules/stickerPackModule/stickerStorageService.js +3 -2
  97. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +2 -1
  98. package/app/modules/systemMetricsModule/AGENT.md +1 -1
  99. package/app/modules/systemMetricsModule/commandConfig.json +29 -0
  100. package/app/modules/systemMetricsModule/pingCommand.js +6 -5
  101. package/app/modules/tiktokModule/AGENT.md +1 -1
  102. package/app/modules/tiktokModule/commandConfig.json +29 -0
  103. package/app/modules/tiktokModule/tiktokCommand.js +2 -1
  104. package/app/modules/userModule/AGENT.md +1 -1
  105. package/app/modules/userModule/commandConfig.json +29 -0
  106. package/app/modules/userModule/userCommand.js +72 -23
  107. package/app/modules/waifuPicsModule/AGENT.md +57 -27
  108. package/app/modules/waifuPicsModule/commandConfig.json +87 -0
  109. package/app/modules/waifuPicsModule/waifuPicsCommand.js +3 -2
  110. package/app/observability/metrics.js +136 -0
  111. package/app/services/ai/commandConfigEnrichmentService.js +229 -47
  112. package/app/services/ai/conversationRouterService.js +4 -3
  113. package/app/services/ai/geminiService.js +132 -7
  114. package/app/services/ai/geminiService.test.js +59 -2
  115. package/app/services/ai/globalModuleAiHelpService.js +3 -2
  116. package/app/services/ai/messageCommandExecutionService.js +2 -1
  117. package/app/services/ai/moduleAiHelpCoreService.js +45 -14
  118. package/app/services/ai/moduleToolExecutorService.js +3 -2
  119. package/app/services/ai/moduleToolRegistryService.js +2 -1
  120. package/app/services/ai/toolCandidateSelectorService.js +6 -5
  121. package/app/services/auth/googleWebLinkService.js +3 -2
  122. package/app/services/auth/whatsappLoginLinkService.js +3 -2
  123. package/app/services/external/pokeApiService.js +4 -3
  124. package/app/services/group/groupMetadataService.js +24 -1
  125. package/app/services/infra/dbWriteQueue.js +57 -26
  126. package/app/services/infra/featureFlagService.js +2 -1
  127. package/app/services/messaging/captchaService.js +3 -2
  128. package/app/services/messaging/newsBroadcastService.js +846 -29
  129. package/app/services/multiSession/assignmentBalancerService.js +457 -0
  130. package/app/services/multiSession/groupOwnershipRepository.js +381 -0
  131. package/app/services/multiSession/groupOwnershipService.js +890 -0
  132. package/app/services/multiSession/groupOwnershipService.test.js +309 -0
  133. package/app/services/multiSession/sessionRegistryService.js +293 -0
  134. package/app/services/sticker/stickerFocusService.js +11 -10
  135. package/app/store/aiPromptStore.js +36 -19
  136. package/app/store/conversationSessionStore.js +7 -6
  137. package/app/store/groupConfigStore.js +41 -5
  138. package/app/store/premiumUserStore.js +21 -7
  139. package/app/utils/antiLink/antiLinkModule.js +352 -16
  140. package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
  141. package/app/workers/aiLearningWorker.js +6 -5
  142. package/app/workers/commandConfigEnrichmentWorker.js +4 -3
  143. package/database/index.js +14 -8
  144. package/database/migrations/20260307_d0_hardening_down.sql +1 -1
  145. package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
  146. package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
  147. package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
  148. package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
  149. package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
  150. package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
  151. package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
  152. package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
  153. package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
  154. package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
  155. package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
  156. package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
  157. package/database/schema.sql +102 -1
  158. package/docker-compose.yml +4 -1
  159. package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
  160. package/docs/compliance/dpa-b2b-standard-2026-03-07.md +1 -1
  161. package/docs/compliance/privacy-policy-2026-03-07.md +4 -4
  162. package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
  163. package/docs/security/incident-response-lgpd-anpd-runbook-2026-03-07.md +1 -1
  164. package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
  165. package/docs/security/omnizap-static-security-headers.conf +25 -0
  166. package/docs/wiki/Home.md +1 -1
  167. package/ecosystem.prod.config.cjs +32 -12
  168. package/index.js +57 -23
  169. package/observability/alert-rules.yml +20 -0
  170. package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
  171. package/observability/mysql-setup.sql +4 -4
  172. package/observability/system-admin-observability.md +26 -0
  173. package/package.json +20 -6
  174. package/public/apple-touch-icon.png +0 -0
  175. package/public/comandos/commands-catalog.json +2853 -3326
  176. package/public/favicon-16x16.png +0 -0
  177. package/public/favicon-32x32.png +0 -0
  178. package/public/favicon.ico +0 -0
  179. package/public/js/apps/apiDocsApp.js +3 -2
  180. package/public/js/apps/commandsReactApp.js +280 -99
  181. package/public/js/apps/createPackApp.js +11 -10
  182. package/public/js/apps/homeReactApp.js +181 -130
  183. package/public/js/apps/loginReactApp.js +1 -1
  184. package/public/js/apps/stickersApp.js +263 -110
  185. package/public/js/apps/termsReactApp.js +73 -24
  186. package/public/js/apps/userApp.js +4 -3
  187. package/public/js/apps/userPasswordResetReactApp.js +406 -0
  188. package/public/js/apps/userReactApp.js +355 -280
  189. package/public/js/apps/userSystemAdmReactApp.js +1506 -0
  190. package/public/pages/api-docs.html +1 -1
  191. package/public/pages/aup.html +2 -2
  192. package/public/pages/dpa.html +3 -3
  193. package/public/pages/licenca.html +4 -4
  194. package/public/pages/login.html +1 -1
  195. package/public/pages/notice-and-takedown.html +2 -2
  196. package/public/pages/politica-de-privacidade.html +6 -6
  197. package/public/pages/seo-bot-whatsapp-para-grupo.html +3 -3
  198. package/public/pages/seo-bot-whatsapp-sem-programar.html +3 -3
  199. package/public/pages/seo-como-automatizar-avisos-no-whatsapp.html +3 -3
  200. package/public/pages/seo-como-criar-comandos-whatsapp.html +3 -3
  201. package/public/pages/seo-como-evitar-spam-no-whatsapp.html +3 -3
  202. package/public/pages/seo-como-moderar-grupo-whatsapp.html +3 -3
  203. package/public/pages/seo-como-organizar-comunidade-whatsapp.html +3 -3
  204. package/public/pages/seo-melhor-bot-whatsapp-para-grupos.html +3 -3
  205. package/public/pages/stickers-admin.html +1 -1
  206. package/public/pages/stickers-create.html +1 -1
  207. package/public/pages/stickers.html +6 -6
  208. package/public/pages/suboperadores.html +2 -2
  209. package/public/pages/termos-de-uso-texto-integral.html +6 -6
  210. package/public/pages/termos-de-uso.html +3 -3
  211. package/public/pages/user-password-reset.html +4 -5
  212. package/public/pages/user-systemadm.html +9 -463
  213. package/public/pages/user.html +2 -2
  214. package/scripts/clear-whatsapp-session.sh +123 -0
  215. package/scripts/core-ai-mode.mjs +163 -0
  216. package/scripts/deploy.sh +11 -1
  217. package/scripts/email-broadcast-terms-update.mjs +2 -1
  218. package/scripts/enrich-command-config-ux-openai.mjs +492 -0
  219. package/scripts/generate-commands-catalog.mjs +166 -2
  220. package/scripts/generate-module-agents.mjs +2 -1
  221. package/scripts/generate-seo-satellite-pages.mjs +5 -4
  222. package/scripts/github-deploy-notify.mjs +2 -1
  223. package/scripts/github-release-notify.mjs +25 -10
  224. package/scripts/new-whatsapp-session.sh +317 -0
  225. package/scripts/release.sh +2 -19
  226. package/scripts/security-smoketest.mjs +6 -5
  227. package/scripts/security-web-surface-check.mjs +218 -0
  228. package/scripts/sticker-catalog-loadtest.mjs +5 -4
  229. package/server/auth/googleWebAuth/googleWebAuthService.js +8 -7
  230. package/server/auth/jwt/webJwtService.js +1 -1
  231. package/server/auth/stickerCatalogAuthContext.js +2 -1
  232. package/server/auth/termsAcceptance/termsAcceptanceHandler.js +2 -1
  233. package/server/auth/userPassword/userPasswordAuthService.js +2 -1
  234. package/server/auth/userPassword/userPasswordRecoveryService.js +4 -3
  235. package/server/auth/webAccount/webAccountHandlers.js +9 -10
  236. package/server/controllers/admin/adminPanelHandlers.js +267 -16
  237. package/server/controllers/admin/systemAdminController.js +267 -0
  238. package/server/controllers/seo/stickerCatalogSeoContext.js +10 -9
  239. package/server/controllers/sticker/nonCatalogHandlers.js +2 -1
  240. package/server/controllers/sticker/stickerCatalogController.js +23 -36
  241. package/server/controllers/system/contactController.js +9 -17
  242. package/server/controllers/system/githubController.js +3 -2
  243. package/server/controllers/system/stickerCatalogSystemContext.js +41 -19
  244. package/server/controllers/system/systemController.js +254 -1
  245. package/server/controllers/system/systemMetricsController.js +2 -1
  246. package/server/controllers/userController.js +6 -0
  247. package/server/email/emailTemplateService.js +5 -3
  248. package/server/http/httpServer.js +11 -6
  249. package/server/middleware/rateLimit.js +2 -1
  250. package/server/middleware/securityHeaders.js +20 -1
  251. package/server/routes/admin/systemAdminRouter.js +6 -0
  252. package/server/routes/indexRouter.js +30 -6
  253. package/server/routes/observability/grafanaProxyRouter.js +254 -0
  254. package/server/routes/static/staticPageRouter.js +27 -1
  255. package/server/utils/publicContact.js +31 -0
  256. package/utils/time/timeModule.js +135 -0
  257. package/utils/time/timeModule.test.js +65 -0
  258. package/utils/whatsapp/contactEnv.js +39 -0
  259. package/vite.config.mjs +7 -1
  260. package/public/assets/images/brand-icon-192.png +0 -0
  261. package/scripts/sync-readme-snapshot.mjs +0 -133
@@ -4,7 +4,7 @@ import htm from 'htm';
4
4
 
5
5
  const html = htm.bind(React.createElement);
6
6
 
7
- const FALLBACK_THUMB_URL = '/assets/images/brand-logo-128.webp';
7
+ const FALLBACK_THUMB_URL = '/apple-touch-icon.png';
8
8
  const HOME_BOOTSTRAP_ENDPOINT = '/api/home-bootstrap';
9
9
  const COMMANDS_CATALOG_ENDPOINT = '/comandos/commands-catalog.json';
10
10
  const SOCIAL_PROOF_REFRESH_MS = 15_000;
@@ -12,10 +12,15 @@ const COUNTUP_DURATION_MS = 1200;
12
12
  const COUNTABLE_METRICS = ['users', 'messages', 'commands', 'packs', 'stickers'];
13
13
  const REVEAL_STAGGER_MS = 60;
14
14
  const MAX_REVEAL_DELAY_MS = 400;
15
+ const REAL_METRIC_BASELINE = {
16
+ users: 5700,
17
+ messages: 534900,
18
+ commands: 1700,
19
+ };
15
20
 
16
21
  const DEFAULT_METRICS = {
17
- users: '50k+',
18
- messages: '100M+',
22
+ users: '5,7 mil',
23
+ messages: '534,9 mil',
19
24
  commands: '1,7 mil',
20
25
  packs: '10k+',
21
26
  stickers: '500k+',
@@ -119,6 +124,11 @@ const shortNum = (value) =>
119
124
  maximumFractionDigits: 1,
120
125
  }).format(Math.max(0, Number(value) || 0));
121
126
 
127
+ const toPositiveNumber = (value) => {
128
+ const num = Number(value);
129
+ return Number.isFinite(num) && num > 0 ? num : 0;
130
+ };
131
+
122
132
  const normalizeSearchText = (value) =>
123
133
  String(value || '')
124
134
  .normalize('NFD')
@@ -279,9 +289,9 @@ const App = () => {
279
289
  setBotMenuUrl(contactUrl);
280
290
 
281
291
  const targetValues = {
282
- users: Number(realtime?.total_users || 0),
283
- messages: Number(realtime?.total_messages || 0),
284
- commands: Number(realtime?.total_commands || 0),
292
+ users: toPositiveNumber(realtime?.total_users) || REAL_METRIC_BASELINE.users,
293
+ messages: toPositiveNumber(realtime?.total_messages) || REAL_METRIC_BASELINE.messages,
294
+ commands: toPositiveNumber(realtime?.total_commands) || REAL_METRIC_BASELINE.commands,
285
295
  packs: Number(stats?.packs_total || stats?.total_packs || 0),
286
296
  stickers: Number(stats?.stickers_total || stats?.total_stickers || 0),
287
297
  };
@@ -417,6 +427,33 @@ const App = () => {
417
427
  background-size: 200% 200%;
418
428
  animation: gradient-x 15s ease infinite;
419
429
  }
430
+ @keyframes shine {
431
+ 0% {
432
+ transform: translateX(-100%) translateY(-100%) rotate(45deg);
433
+ }
434
+ 100% {
435
+ transform: translateX(100%) translateY(100%) rotate(45deg);
436
+ }
437
+ }
438
+ .hover-shine {
439
+ position: relative;
440
+ overflow: hidden;
441
+ }
442
+ .hover-shine::after {
443
+ content: '';
444
+ position: absolute;
445
+ top: -50%;
446
+ left: -50%;
447
+ width: 200%;
448
+ height: 200%;
449
+ background: linear-gradient(rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.05) 50%, rgba(255, 255, 255, 0) 100%);
450
+ transform: translateX(-100%) translateY(-100%) rotate(45deg);
451
+ transition: transform 0.6s;
452
+ pointer-events: none;
453
+ }
454
+ .hover-shine:hover::after {
455
+ transform: translateX(100%) translateY(100%) rotate(45deg);
456
+ }
420
457
  .no-scrollbar::-webkit-scrollbar {
421
458
  display: none;
422
459
  }
@@ -441,7 +478,7 @@ const App = () => {
441
478
  <div className="flex h-16 items-center justify-between gap-4">
442
479
  <div className="flex-1">
443
480
  <a href="/" className="flex items-center gap-2.5 hover:opacity-80 transition-opacity">
444
- <img src="/assets/images/brand-logo-128.webp" className="w-8 h-8 sm:w-9 sm:h-9 rounded-xl shadow-sm" alt="Logo" />
481
+ <img src="/apple-touch-icon.png" className="w-8 h-8 sm:w-9 sm:h-9 rounded-xl shadow-sm" alt="Logo" />
445
482
  <span className="text-base sm:text-lg font-black tracking-tight">OmniZap<span className="text-primary">.</span></span>
446
483
  </a>
447
484
  </div>
@@ -449,23 +486,27 @@ const App = () => {
449
486
  <!-- Desktop Nav Items (Middle) -->
450
487
  <nav className="hidden lg:flex items-center gap-1 mx-4">${NAV_ITEMS.map((item) => html` <a href=${item.href} className="btn btn-ghost btn-sm rounded-lg font-medium text-white/50 hover:text-primary hover:bg-white/5 transition-all uppercase text-[10px] tracking-widest"> ${item.label} </a> `)}</nav>
451
488
 
452
- <div className="flex items-center gap-2 sm:gap-4">
489
+ <div className="flex items-center">
453
490
  ${session?.user
454
491
  ? html`
455
- <a href="/user/" className="group relative flex items-center gap-3 pl-1 pr-4 py-1.5 rounded-2xl bg-white/5 border border-white/10 hover:border-primary/40 transition-all duration-300">
456
- <div className="relative">
457
- <img src=${authInfo.image} className="w-8 h-8 sm:w-9 sm:h-9 rounded-xl object-cover border border-white/10 group-hover:border-primary/50 transition-colors" />
458
- <div className="absolute -bottom-1 -right-1 w-3 h-3 bg-success border-2 border-[#020617] rounded-full"></div>
492
+ <a href="/user/" className="group relative flex items-center h-11 gap-3 pl-1.5 pr-1.5 sm:pr-5 rounded-2xl bg-white/5 border border-white/10 hover:border-primary/40 hover:bg-primary/5 transition-all duration-500 hover:shadow-[0_0_20px_rgba(34,197,94,0.15)]">
493
+ <div className="relative flex-shrink-0">
494
+ <img src=${authInfo.image} className="w-8 h-8 sm:w-9 sm:h-9 rounded-xl object-cover border border-white/10 group-hover:border-primary/50 transition-all duration-500 group-hover:scale-105" />
495
+ <div className="absolute -bottom-1 -right-1 w-3 h-3 bg-success border-2 border-[#020617] rounded-full shadow-[0_0_8px_rgba(34,197,94,0.8)] group-hover:animate-pulse"></div>
459
496
  </div>
460
- <div className="hidden sm:flex flex-col items-start -gap-1">
461
- <span className="text-[10px] font-black uppercase tracking-widest text-white/40 group-hover:text-primary transition-colors">${authInfo.label}</span>
462
- <span className="text-[8px] font-bold text-white/20 uppercase tracking-tighter">Painel de Controle</span>
497
+ <div className="hidden sm:flex flex-col items-start gap-0.5">
498
+ <span className="text-[10px] font-black uppercase tracking-widest text-white/40 group-hover:text-primary transition-colors leading-tight">${authInfo.label}</span>
499
+ <span className="text-[8px] font-bold text-white/20 uppercase tracking-tighter leading-tight group-hover:text-white/40 transition-colors">Painel de Controle</span>
463
500
  </div>
501
+ <div className="absolute inset-0 rounded-2xl bg-gradient-to-r from-primary/0 via-primary/5 to-primary/0 opacity-0 group-hover:opacity-100 transition-opacity duration-700 pointer-events-none"></div>
464
502
  </a>
465
503
  `
466
- : html` <a href="/login/" className="btn btn-ghost btn-sm h-10 rounded-xl border border-white/10 hover:bg-white/5 px-4 font-bold text-[10px] uppercase tracking-widest text-white/70"> Entrar </a> `}
467
-
468
- <a href=${botMenuUrl} className="btn btn-primary btn-sm h-10 rounded-xl shadow-lg shadow-primary/20 text-[10px] font-black uppercase tracking-widest px-5"> <span className="hidden xs:inline text-[9px]">Adicionar</span> Bot </a>
504
+ : html`
505
+ <a href="/login/" className="group relative overflow-hidden btn btn-primary btn-sm h-11 min-h-0 rounded-2xl px-8 font-black text-[10px] uppercase tracking-[0.2em] shadow-lg shadow-primary/20 hover:shadow-primary/40 hover:scale-105 active:scale-95 transition-all border-none">
506
+ <span className="relative z-10">Entrar</span>
507
+ <div className="absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000"></div>
508
+ </a>
509
+ `}
469
510
  </div>
470
511
  </div>
471
512
 
@@ -515,7 +556,7 @@ const App = () => {
515
556
  </div>
516
557
  <div className="w-px h-12 bg-white/5 hidden lg:block"></div>
517
558
  <div className="relative group col-span-2 sm:col-auto text-center lg:text-left pt-2 sm:pt-0 border-t border-white/5 sm:border-none">
518
- <div className="text-3xl sm:text-5xl font-black text-white/80 group-hover:text-primary transition-colors">1,7 mil</div>
559
+ <div className="text-3xl sm:text-5xl font-black text-white/80 group-hover:text-primary transition-colors">${metrics.commands}</div>
519
560
  <div className="text-[9px] sm:text-[10px] uppercase font-black text-white/30 tracking-[0.2em] sm:tracking-[0.3em] mt-1">comandos usados</div>
520
561
  </div>
521
562
  </div>
@@ -558,9 +599,9 @@ const App = () => {
558
599
  <!-- Stats Marquee (Social Proof) -->
559
600
  <div className="bg-primary/5 border-y border-white/5 overflow-hidden py-5">
560
601
  <div className="animate-marquee-infinite gap-12 items-center text-[11px] font-black uppercase tracking-[0.4em] text-primary/50">
561
- <span>Usado por +50.000 Grupos</span>
602
+ <span>5,7 mil usuarios reais</span>
562
603
  <span className="text-white/10">•</span>
563
- <span>+100M Mensagens Processadas</span>
604
+ <span>534,9 mil mensagens processadas</span>
564
605
  <span className="text-white/10">•</span>
565
606
  <span>IA de Última Geração</span>
566
607
  <span className="text-white/10">•</span>
@@ -571,9 +612,9 @@ const App = () => {
571
612
  <span>Moderação Ativa 24/7</span>
572
613
  <span className="text-white/10">•</span>
573
614
  {/* Duplicating for seamless loop */}
574
- <span>Usado por +50.000 Grupos</span>
615
+ <span>5,7 mil usuarios reais</span>
575
616
  <span className="text-white/10">•</span>
576
- <span>+100M Mensagens Processadas</span>
617
+ <span>534,9 mil mensagens processadas</span>
577
618
  <span className="text-white/10">•</span>
578
619
  <span>IA de Última Geração</span>
579
620
  <span className="text-white/10">•</span>
@@ -609,10 +650,10 @@ const App = () => {
609
650
  <div className="grid grid-cols-1 md:grid-cols-3 gap-8">
610
651
  ${STEPS.map(
611
652
  (s) => html`
612
- <div key=${s.step} data-reveal="fade-up" className="relative group p-8 rounded-[2.5rem] bg-white/[0.02] border border-white/5 hover:border-primary/20 transition-all duration-500">
613
- <div className="absolute top-8 right-8 text-4xl font-black text-primary/10 group-hover:text-primary/20 transition-colors">${s.step}</div>
614
- <div className="w-12 h-12 rounded-2xl bg-primary/10 flex items-center justify-center text-primary font-black mb-6 border border-primary/20">${s.step}</div>
615
- <h3 className="text-xl font-bold mb-3">${s.title}</h3>
653
+ <div key=${s.step} data-reveal="fade-up" className="relative group p-8 rounded-[2.5rem] bg-white/[0.02] border border-white/5 hover:border-primary/30 hover:-translate-y-2 hover:shadow-2xl hover:shadow-primary/10 transition-all duration-500 overflow-hidden">
654
+ <div className="absolute top-8 right-8 text-4xl font-black text-primary/10 group-hover:text-primary/30 group-hover:scale-150 group-hover:-rotate-12 transition-all duration-700">${s.step}</div>
655
+ <div className="w-12 h-12 rounded-2xl bg-primary/10 flex items-center justify-center text-primary font-black mb-6 border border-primary/20 group-hover:bg-primary group-hover:text-primary-content group-hover:scale-110 transition-all duration-500">${s.step}</div>
656
+ <h3 className="text-xl font-bold mb-3 group-hover:text-primary transition-colors">${s.title}</h3>
616
657
  <p className="text-white/40 leading-relaxed text-sm font-medium">${s.desc}</p>
617
658
  </div>
618
659
  `,
@@ -636,10 +677,11 @@ const App = () => {
636
677
  <div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-6">
637
678
  ${FEATURES.map(
638
679
  (f) => html`
639
- <div data-reveal="fade-up" className="group p-8 rounded-[2.5rem] bg-[#020617] border border-white/5 hover:border-primary/30 transition-all hover:shadow-2xl hover:shadow-primary/5">
640
- <div className="w-14 h-14 rounded-2xl bg-white/5 flex items-center justify-center text-3xl mb-6 group-hover:scale-110 group-hover:bg-primary/10 transition-all border border-white/5">${f.icon}</div>
641
- <h3 className="text-xl font-bold mb-3">${f.title}</h3>
642
- <p className="text-white/40 leading-relaxed text-sm font-medium">${f.desc}</p>
680
+ <div data-reveal="fade-up" className="group p-8 rounded-[2.5rem] bg-[#020617] border border-white/5 hover:border-primary/40 hover:-translate-y-2 transition-all duration-500 hover:shadow-2xl hover:shadow-primary/10 relative overflow-hidden">
681
+ <div className="absolute -right-10 -bottom-10 w-32 h-32 bg-primary/5 blur-3xl group-hover:bg-primary/10 transition-colors duration-700 rounded-full"></div>
682
+ <div className="w-14 h-14 rounded-2xl bg-white/5 flex items-center justify-center text-3xl mb-6 group-hover:scale-110 group-hover:rotate-6 group-hover:bg-primary/10 transition-all border border-white/5 group-hover:border-primary/20">${f.icon}</div>
683
+ <h3 className="text-xl font-bold mb-3 group-hover:text-primary transition-colors">${f.title}</h3>
684
+ <p className="text-white/40 leading-relaxed text-sm font-medium group-hover:text-white/60 transition-colors">${f.desc}</p>
643
685
  </div>
644
686
  `,
645
687
  )}
@@ -666,7 +708,7 @@ const App = () => {
666
708
  </div>
667
709
 
668
710
  <div className="hidden lg:block p-6 rounded-2xl bg-primary/5 border border-primary/10">
669
- <div className="text-primary font-black text-xl mb-1">1,7 mil+</div>
711
+ <div className="text-primary font-black text-xl mb-1">${metrics.commands}</div>
670
712
  <div className="text-[10px] uppercase font-bold tracking-widest opacity-50">comandos usados</div>
671
713
  </div>
672
714
  <a href="/comandos/" className="btn btn-outline border-white/10 btn-block rounded-xl hidden lg:flex font-black text-[10px] uppercase tracking-widest h-12">Ver Todos os Comandos</a>
@@ -675,19 +717,19 @@ const App = () => {
675
717
  <div className="w-full lg:w-2/3 grid grid-cols-1 md:grid-cols-2 gap-4 sm:gap-6">
676
718
  ${filteredCommandBlocks.map(
677
719
  (block) => html`
678
- <div data-reveal="fade-up" className="bg-white/[0.02] border border-white/5 rounded-3xl overflow-hidden group hover:border-primary/20 transition-all">
720
+ <div data-reveal="fade-up" className="bg-white/[0.02] border border-white/5 rounded-3xl overflow-hidden group hover:border-primary/30 transition-all hover:bg-white/[0.04] hover:scale-[1.02] duration-500 hover-shine">
679
721
  <div className="p-5 sm:p-8">
680
- <h3 className="text-xs sm:text-sm font-black uppercase tracking-[0.2em] text-primary/60 mb-5 sm:mb-6 flex items-center gap-2">
681
- <span className="w-1.5 h-1.5 rounded-full bg-primary shadow-[0_0_8px_rgba(34,197,94,0.5)]"></span>
722
+ <h3 className="text-xs sm:text-sm font-black uppercase tracking-[0.2em] text-primary/60 mb-5 sm:mb-6 flex items-center gap-2 group-hover:text-primary transition-colors">
723
+ <span className="w-1.5 h-1.5 rounded-full bg-primary shadow-[0_0_8px_rgba(34,197,94,0.5)] group-hover:animate-ping"></span>
682
724
  ${block.title}
683
725
  </h3>
684
726
  <div className="grid gap-4 sm:gap-5">
685
727
  ${block.items.map(
686
728
  ([cmd, label]) => html`
687
- <div className="flex items-start gap-3 group">
729
+ <div className="flex items-start gap-3 group/item">
688
730
  <div className="flex-1">
689
- <div className="font-mono text-sm font-bold text-white/90 group-hover:text-primary transition-colors">${cmd}</div>
690
- <div className="text-[11px] sm:text-xs text-white/30 font-medium leading-tight">${label}</div>
731
+ <div className="font-mono text-sm font-bold text-white/90 group-hover/item:text-primary transition-colors transform group-hover/item:translate-x-1 duration-300">${cmd}</div>
732
+ <div className="text-[11px] sm:text-xs text-white/30 font-medium leading-tight group-hover/item:text-white/50 transition-colors">${label}</div>
691
733
  </div>
692
734
  </div>
693
735
  `,
@@ -700,7 +742,7 @@ const App = () => {
700
742
 
701
743
  <!-- Mobile Only CTA -->
702
744
  <div className="lg:hidden mt-2">
703
- <a href="/comandos/" className="btn btn-block btn-outline border-white/10 rounded-2xl h-14 font-black text-[10px] uppercase tracking-widest"> Ver Todos os Comandos </a>
745
+ <a href="/comandos/" className="btn btn-block btn-outline border-white/10 rounded-2xl h-14 font-black text-[10px] uppercase tracking-widest active:bg-primary active:text-primary-content active:border-primary"> Ver Todos os Comandos </a>
704
746
  </div>
705
747
  </div>
706
748
  </div>
@@ -718,9 +760,9 @@ const App = () => {
718
760
  <div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-4">
719
761
  ${GUIDES.map(
720
762
  (guide) => html`
721
- <a href=${guide.href} data-reveal="fade-up" className="p-6 rounded-3xl bg-white/[0.02] border border-white/5 hover:border-primary/40 transition-all group">
763
+ <a href=${guide.href} data-reveal="fade-up" className="p-6 rounded-3xl bg-white/[0.02] border border-white/5 hover:border-primary/40 hover:-translate-y-1 transition-all duration-500 group hover:bg-white/[0.04] hover-shine">
722
764
  <h3 className="font-black mb-2 group-hover:text-primary transition-colors text-white/80">${guide.title}</h3>
723
- <p className="text-xs text-white/30 leading-relaxed font-medium">${guide.desc}</p>
765
+ <p className="text-xs text-white/30 leading-relaxed font-medium group-hover:text-white/50 transition-colors">${guide.desc}</p>
724
766
  </a>
725
767
  `,
726
768
  )}
@@ -737,43 +779,43 @@ const App = () => {
737
779
  </div>
738
780
 
739
781
  <div className="grid md:grid-cols-2 gap-8 max-w-4xl mx-auto">
740
- <div data-reveal="fade-up" className="p-8 rounded-[2.5rem] bg-white/[0.02] border border-white/5 flex flex-col hover:border-white/10 transition-all">
782
+ <div data-reveal="fade-up" className="p-8 rounded-[2.5rem] bg-white/[0.02] border border-white/5 flex flex-col hover:border-white/20 transition-all duration-500 hover:bg-white/[0.04] group/free hover-shine">
741
783
  <div className="mb-8">
742
- <h3 className="text-xl font-bold mb-2">Plano Gratuito</h3>
743
- <div className="text-4xl font-black mb-4">R$ 0<span className="text-sm text-white/20 font-medium italic">/sempre</span></div>
784
+ <h3 className="text-xl font-bold mb-2 group-hover/free:text-white transition-colors">Plano Gratuito</h3>
785
+ <div className="text-4xl font-black mb-4 group-hover/free:scale-105 origin-left transition-transform duration-500">R$ 0<span className="text-sm text-white/20 font-medium italic">/sempre</span></div>
744
786
  <p className="text-sm text-white/40">Ideal para grupos pequenos e iniciantes.</p>
745
787
  </div>
746
788
  <ul className="space-y-4 mb-10 flex-1">
747
789
  ${['Moderação básica', 'Figurinhas ilimitadas', 'Comandos de utilidades', 'Uso compartilhado de IA'].map(
748
790
  (item) => html`
749
- <li className="flex items-center gap-3 text-sm font-medium text-white/60">
750
- <svg className="w-5 h-5 text-emerald-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M5 13l4 4L19 7" /></svg>
791
+ <li className="flex items-center gap-3 text-sm font-medium text-white/60 group-hover/free:text-white/80 transition-colors">
792
+ <svg className="w-5 h-5 text-emerald-500 group-hover/free:scale-125 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M5 13l4 4L19 7" /></svg>
751
793
  ${item}
752
794
  </li>
753
795
  `,
754
796
  )}
755
797
  </ul>
756
- <a href=${botMenuUrl} className="btn btn-outline border-white/10 rounded-xl font-black">Adicionar Grátis</a>
798
+ <a href=${botMenuUrl} className="btn btn-outline border-white/10 rounded-xl font-black hover:bg-white hover:text-[#020617] hover:border-white transition-all">Adicionar Grátis</a>
757
799
  </div>
758
800
 
759
- <div data-reveal="fade-up" className="p-8 rounded-[2.5rem] bg-primary/5 border border-primary/20 flex flex-col relative overflow-hidden group hover:border-primary/40 transition-all">
760
- <div className="absolute top-6 right-6 px-3 py-1 rounded-full bg-primary text-[#020617] text-[10px] font-black uppercase tracking-widest">Recomendado</div>
801
+ <div data-reveal="fade-up" className="p-8 rounded-[2.5rem] bg-primary/5 border border-primary/20 flex flex-col relative overflow-hidden group hover:border-primary/60 transition-all duration-500 hover:scale-[1.03] hover:shadow-2xl hover:shadow-primary/20 hover-shine">
802
+ <div className="absolute top-6 right-6 px-3 py-1 rounded-full bg-primary text-[#020617] text-[10px] font-black uppercase tracking-widest group-hover:scale-110 transition-transform">Recomendado</div>
761
803
  <div className="mb-8">
762
804
  <h3 className="text-xl font-bold mb-2 text-primary">Plano Premium</h3>
763
- <div className="text-4xl font-black mb-4 text-white">R$ 14,90<span className="text-sm text-white/20 font-medium italic">/mês</span></div>
805
+ <div className="text-4xl font-black mb-4 text-white group-hover:scale-105 origin-left transition-transform duration-500">R$ 14,90<span className="text-sm text-white/20 font-medium italic">/mês</span></div>
764
806
  <p className="text-sm text-white/40">Potência máxima para administradores profissionais.</p>
765
807
  </div>
766
808
  <ul className="space-y-4 mb-10 flex-1">
767
809
  ${['IA sem limites (GPT-4o)', 'Webhooks & API Docs', 'Backup de mensagens', 'Rankings customizados', 'Suporte prioritário'].map(
768
810
  (item) => html`
769
- <li className="flex items-center gap-3 text-sm font-medium text-white/90">
770
- <svg className="w-5 h-5 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M5 13l4 4L19 7" /></svg>
811
+ <li className="flex items-center gap-3 text-sm font-medium text-white/90 group-hover:translate-x-1 transition-transform duration-300">
812
+ <svg className="w-5 h-5 text-primary group-hover:scale-125 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M5 13l4 4L19 7" /></svg>
771
813
  ${item}
772
814
  </li>
773
815
  `,
774
816
  )}
775
817
  </ul>
776
- <a href=${botMenuUrl} className="btn btn-primary rounded-xl font-black shadow-lg shadow-primary/20">Quero ser Premium</a>
818
+ <a href=${botMenuUrl} className="btn btn-primary rounded-xl font-black shadow-lg shadow-primary/20 group-hover:shadow-primary/40 transition-all hover:scale-105">Quero ser Premium</a>
777
819
  </div>
778
820
  </div>
779
821
  </div>
@@ -831,96 +873,105 @@ const App = () => {
831
873
  </div>
832
874
  </div>
833
875
  </section>
876
+ </main>
834
877
 
835
- <!-- Developer Section (API) -->
836
- <section className="py-24 relative overflow-hidden">
837
- <div className="container mx-auto px-4">
838
- <div className="grid lg:grid-cols-2 gap-16 items-center">
839
- <div data-reveal="fade-right" className="space-y-6">
840
- <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-emerald-500/10 border border-emerald-500/20 text-emerald-500 text-[10px] font-black uppercase tracking-widest">Built for Devs</div>
841
- <h2 className="text-4xl sm:text-5xl font-black tracking-tight">API & Webhooks</h2>
842
- <p className="text-white/40 text-lg font-medium leading-relaxed">Integre o OmniZap com seus sistemas. Use nossa API REST para enviar mensagens, gerenciar grupos e receber eventos via Webhooks em tempo real.</p>
843
- <div className="flex gap-4">
844
- <a href="/api-docs/" className="btn btn-primary rounded-xl px-8">Documentação</a>
845
- <a href="https://github.com/Omnizap-System/omnizap" target="_blank" className="btn btn-ghost border-white/5 rounded-xl px-8 hover:bg-white/5">GitHub</a>
878
+ <!-- Footer -->
879
+ <footer className="bg-[#020617] border-t border-white/5 pt-20 pb-10 relative overflow-hidden">
880
+ <div className="absolute top-0 left-1/2 -translate-x-1/2 w-full h-px bg-gradient-to-r from-transparent via-primary/20 to-transparent"></div>
881
+
882
+ <div className="container mx-auto px-4">
883
+ <div className="grid grid-cols-2 lg:grid-cols-12 gap-12 mb-20">
884
+ <!-- Brand Column -->
885
+ <div className="col-span-2 lg:col-span-4 space-y-6">
886
+ <div className="flex items-center gap-3 justify-center lg:justify-start">
887
+ <div className="w-10 h-10 rounded-xl bg-primary/10 flex items-center justify-center border border-primary/20 shadow-[0_0_20px_rgba(34,197,94,0.1)]">
888
+ <img src="/apple-touch-icon.png" className="w-7 h-7 rounded-lg" />
846
889
  </div>
890
+ <span className="text-2xl font-black tracking-tighter">OmniZap<span className="text-primary">.</span></span>
847
891
  </div>
848
- <div data-reveal="fade-left" className="relative">
849
- <div className="absolute -inset-4 bg-emerald-500/10 blur-3xl opacity-50 rounded-full"></div>
850
- <div className="relative bg-[#0b0f1a] rounded-2xl border border-white/10 p-1 overflow-hidden shadow-2xl">
851
- <div className="flex items-center gap-2 px-4 py-2 border-b border-white/5 bg-white/[0.02]">
852
- <div className="w-2 h-2 rounded-full bg-red-500/50"></div>
853
- <div className="w-2 h-2 rounded-full bg-yellow-500/50"></div>
854
- <div className="w-2 h-2 rounded-full bg-green-500/50"></div>
855
- <span className="text-[10px] font-mono text-white/20 ml-2 uppercase">send-message.js</span>
856
- </div>
857
- <pre className="p-6 font-mono text-xs sm:text-sm leading-relaxed overflow-x-auto no-scrollbar">
858
- <code className="text-white/80">
859
- <span className="text-emerald-400">fetch</span>('<span className="text-secondary">/api/v1/messages/send</span>', {<br/>
860
- ${' '}method: '<span className="text-secondary">POST</span>',<br/>
861
- ${' '}headers: { '<span className="text-secondary">Authorization</span>': '<span className="text-emerald-400">Bearer API_KEY</span>' },<br/>
862
- ${' '}body: <span className="text-emerald-400">JSON</span>.<span className="text-emerald-400">stringify</span>({<br/>
863
- ${' '}to: '<span className="text-secondary">551199999999@c.us</span>',<br/>
864
- ${' '}text: '<span className="text-secondary">Hello from OmniZap! 🚀</span>'<br/>
865
- ${' '})<br/>
866
- });
867
- </code>
868
- </pre>
869
- </div>
892
+ <p className="text-sm text-white/30 leading-relaxed font-medium text-center lg:text-left max-w-sm mx-auto lg:mx-0">A próxima geração de automação para WhatsApp. Unindo IA Generativa, segurança LGPD e alta performance para escalar sua comunidade.</p>
893
+ <div className="flex items-center gap-4 justify-center lg:justify-start pt-2">
894
+ <a href="https://github.com/Omnizap-System/omnizap" target="_blank" className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center hover:bg-primary/10 hover:text-primary transition-all border border-white/5 hover:border-primary/30 group">
895
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.02-1.04-.032-2.037-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" /></svg>
896
+ </a>
897
+ <a href=${botMenuUrl} target="_blank" className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center hover:bg-primary/10 hover:text-primary transition-all border border-white/5 hover:border-primary/30 group">
898
+ <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.397-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.506-.173-.007-.371-.007-.57-.007-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.131.57-.074 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-2.578l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L0 24l6.335-1.662c1.72 1.017 3.691 1.553 5.7 1.553h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z" /></svg>
899
+ </a>
870
900
  </div>
871
901
  </div>
872
- </div>
873
- </section>
874
- </main>
875
902
 
876
- <!-- Footer -->
877
- <footer className="bg-[#020617] border-t border-white/5 py-16">
878
- <div className="container mx-auto px-4">
879
- <div className="grid grid-cols-2 lg:grid-cols-4 gap-12 mb-12 text-center lg:text-left">
880
- <div className="col-span-2 lg:col-span-1 space-y-4">
881
- <div className="flex items-center justify-center lg:justify-start gap-2">
882
- <img src="/assets/images/brand-logo-128.webp" className="w-8 h-8 rounded-lg" />
883
- <span className="text-xl font-black tracking-tighter">OmniZap<span className="text-primary">.</span></span>
903
+ <!-- Links Sections -->
904
+ <div className="col-span-2 lg:col-span-8 grid grid-cols-2 md:grid-cols-4 gap-8">
905
+ <div className="space-y-6">
906
+ <h4 className="font-bold text-xs uppercase tracking-widest text-primary/60 cursor-default">Plataforma</h4>
907
+ <ul className="space-y-3">
908
+ <li>
909
+ <a href="/login/" className="text-sm font-medium text-white/40 hover:text-white transition-colors flex items-center gap-2 group"><span className="w-1.5 h-1.5 rounded-full bg-white/10 group-hover:bg-primary transition-colors"></span> Painel Web</a>
910
+ </li>
911
+ <li>
912
+ <a href="/comandos/" className="text-sm font-medium text-white/40 hover:text-white transition-colors flex items-center gap-2 group"><span className="w-1.5 h-1.5 rounded-full bg-white/10 group-hover:bg-primary transition-colors"></span> Comandos</a>
913
+ </li>
914
+ <li>
915
+ <a href="/stickers/" className="text-sm font-medium text-white/40 hover:text-white transition-colors flex items-center gap-2 group"><span className="w-1.5 h-1.5 rounded-full bg-white/10 group-hover:bg-primary transition-colors"></span> Catálogo</a>
916
+ </li>
917
+ <li>
918
+ <a href="/api-docs/" className="text-sm font-medium text-white/40 hover:text-white transition-colors flex items-center gap-2 group"><span className="w-1.5 h-1.5 rounded-full bg-white/10 group-hover:bg-primary transition-colors"></span> API Docs</a>
919
+ </li>
920
+ </ul>
884
921
  </div>
885
- <p className="text-xs text-white/30 leading-relaxed font-medium">
886
- Plataforma Open Source de automação WhatsApp. <br />
887
- Feito para a comunidade brasileira.
888
- </p>
889
- </div>
890
922
 
891
- <div>
892
- <h4 className="font-bold text-xs uppercase tracking-widest text-white/20 mb-6">Explorar</h4>
893
- <ul className="space-y-3 text-sm font-black text-white/50">
894
- <li><a href="/comandos/" className="hover:text-primary transition-colors">Biblioteca de Comandos</a></li>
895
- <li><a href="/api-docs/" className="hover:text-primary transition-colors">Documentação API</a></li>
896
- <li><a href="/login/" className="hover:text-primary transition-colors">Painel de Usuário</a></li>
897
- </ul>
898
- </div>
923
+ <div className="space-y-6">
924
+ <h4 className="font-bold text-xs uppercase tracking-widest text-primary/60 cursor-default">Recursos</h4>
925
+ <ul className="space-y-3">
926
+ <li><a href="#recursos" className="text-sm font-medium text-white/40 hover:text-white transition-colors">IA Generativa</a></li>
927
+ <li><a href="#recursos" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Moderação</a></li>
928
+ <li><a href="#recursos" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Downloads</a></li>
929
+ <li><a href="#guias" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Guias SEO</a></li>
930
+ </ul>
931
+ </div>
899
932
 
900
- <div>
901
- <h4 className="font-bold text-xs uppercase tracking-widest text-white/20 mb-6">Legal</h4>
902
- <ul className="space-y-3 text-sm font-medium text-white/40">
903
- <li><a href="/termos-de-uso/" className="hover:text-primary transition-colors">Termos</a></li>
904
- <li><a href="/politica-de-privacidade/" className="hover:text-primary transition-colors">Privacidade</a></li>
905
- <li><a href="/licenca/" className="hover:text-primary transition-colors">Licença</a></li>
906
- </ul>
907
- </div>
933
+ <div className="space-y-6">
934
+ <h4 className="font-bold text-xs uppercase tracking-widest text-primary/60 cursor-default">Suporte</h4>
935
+ <ul className="space-y-3">
936
+ <li><a href="#faq" className="text-sm font-medium text-white/40 hover:text-white transition-colors">FAQ</a></li>
937
+ <li><a href=${botMenuUrl} className="text-sm font-medium text-white/40 hover:text-white transition-colors">Central de Ajuda</a></li>
938
+ <li><a href="https://github.com/Omnizap-System/omnizap/issues" target="_blank" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Reportar Bug</a></li>
939
+ <li><a href="/suboperadores/" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Transparência</a></li>
940
+ </ul>
941
+ </div>
908
942
 
909
- <div>
910
- <h4 className="font-bold text-xs uppercase tracking-widest text-white/20 mb-6">Social</h4>
911
- <ul className="space-y-3 text-sm font-medium text-white/40">
912
- <li><a href="https://github.com/Omnizap-System/omnizap" target="_blank" className="hover:text-primary transition-colors">GitHub</a></li>
913
- <li><a href=${botMenuUrl} className="hover:text-primary transition-colors">WhatsApp</a></li>
914
- </ul>
943
+ <div className="space-y-6">
944
+ <h4 className="font-bold text-xs uppercase tracking-widest text-primary/60 cursor-default">Legal</h4>
945
+ <ul className="space-y-3">
946
+ <li><a href="/termos-de-uso/" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Termos</a></li>
947
+ <li><a href="/politica-de-privacidade/" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Privacidade</a></li>
948
+ <li><a href="/aup/" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Uso Aceitável</a></li>
949
+ <li><a href="/licenca/" className="text-sm font-medium text-white/40 hover:text-white transition-colors">Licença MIT</a></li>
950
+ </ul>
951
+ </div>
915
952
  </div>
916
953
  </div>
917
954
 
918
- <div className="border-t border-white/5 pt-8 flex flex-col sm:flex-row justify-between items-center gap-4 text-[10px] font-bold uppercase tracking-[0.2em] text-white/20">
919
- <span>© 2026 OMNIZAP SYSTEM</span>
920
- <div className="flex items-center gap-4">
921
- <span>STATUS: <span className="text-success">${metrics.status}</span></span>
922
- <span className="text-white/10">•</span>
923
- <span>VERSION: 2.5.8</span>
955
+ <!-- Bottom Bar -->
956
+ <div className="border-t border-white/5 pt-8 flex flex-col sm:flex-row justify-between items-center gap-6">
957
+ <div className="flex flex-col sm:flex-row items-center gap-4 sm:gap-8 text-[10px] font-bold uppercase tracking-[0.2em] text-white/20">
958
+ <span 2026 OMNIZAP · ALL RIGHTS RESERVED</span>
959
+ <div className="hidden sm:block w-px h-3 bg-white/10"></div>
960
+ <div className="flex items-center gap-4">
961
+ <span>STATUS: <span className="text-success">${metrics.status}</span></span>
962
+ <span className="text-white/10">•</span>
963
+ <span>LATENCY: <span className="text-primary">${metrics.latency}</span></span>
964
+ </div>
965
+ </div>
966
+
967
+ <div className="flex items-center gap-6">
968
+ <div className="flex items-center gap-2 px-3 py-1.5 rounded-lg bg-white/5 border border-white/5">
969
+ <div className="w-1.5 h-1.5 rounded-full bg-primary animate-pulse"></div>
970
+ <span className="text-[9px] font-black uppercase tracking-widest text-white/40">v2.6.0 Stable</span>
971
+ </div>
972
+ <a href="#top" className="w-10 h-10 rounded-xl bg-white/5 flex items-center justify-center hover:bg-primary hover:text-primary-content transition-all border border-white/5 active:scale-90">
973
+ <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M5 15l7-7 7 7" /></svg>
974
+ </a>
924
975
  </div>
925
976
  </div>
926
977
  </div>
@@ -482,7 +482,7 @@ const LoginApp = ({ config }) => {
482
482
 
483
483
  <footer className="py-12 border-t border-base-200">
484
484
  <div className="container mx-auto px-4 text-center">
485
- <p className="text-[10px] font-bold uppercase tracking-[0.3em] text-base-content/20">© 2026 OMNIZAP SYSTEM · SECURE LOGIN V2</p>
485
+ <p className="text-[10px] font-bold uppercase tracking-[0.3em] text-base-content/20">© 2026 OMNIZAP · SECURE LOGIN V2</p>
486
486
  </div>
487
487
  </footer>
488
488
  </div>