@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,337 +1,327 @@
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>OmniZap System | Login</title>
7
- <meta
8
- name="description"
9
- content="Login OmniZap System com Google para vincular sua conta ao numero do WhatsApp."
10
- />
11
- <meta name="robots" content="noindex, nofollow" />
12
- <meta name="theme-color" content="#0f172a" />
13
- <link rel="canonical" href="https://omnizap.shop/login/" />
14
- <link rel="icon" type="image/jpeg" href="https://iili.io/FC3FABe.jpg" />
15
- <link rel="preconnect" href="https://fonts.googleapis.com" />
16
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
17
- <link
18
- href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Sora:wght@500;600;700&display=swap"
19
- rel="stylesheet"
20
- />
21
- <script>
22
- (() => {
23
- try {
24
- const params = new URLSearchParams(window.location.search || '');
25
- const phone = String(params.get('wa') || '').replace(/\D+/g, '');
26
- if (phone) {
27
- document.documentElement.setAttribute('data-login-has-wa', '1');
28
- }
29
- } catch {}
30
- })();
31
- </script>
32
- <style>
33
- :root {
34
- --bg: #0f172a;
35
- --bg-2: #111827;
36
- --card: #1e293bcf;
37
- --line: rgba(255, 255, 255, 0.05);
38
- --text: #f8fafc;
39
- --muted: #94a3b8;
40
- --primary: #22c55e;
41
- --error: #f87171;
42
- --radius: 18px;
43
- }
44
-
45
- * {
46
- box-sizing: border-box;
47
- }
48
-
49
- html,
50
- body {
51
- margin: 0;
52
- padding: 0;
53
- min-height: 100%;
54
- }
55
-
56
- body {
57
- color: var(--text);
58
- font-family: "Manrope", system-ui, sans-serif;
59
- background:
60
- radial-gradient(55rem 22rem at -10% -10%, #2563eb30, transparent 60%),
61
- radial-gradient(55rem 22rem at 110% -8%, #7c3aed22, transparent 56%),
62
- linear-gradient(160deg, var(--bg), var(--bg-2));
63
- min-height: 100vh;
64
- display: flex;
65
- align-items: center;
66
- justify-content: center;
67
- padding: 24px 14px;
68
- }
69
-
70
- .page {
71
- width: min(760px, 100%);
72
- border: 1px solid rgba(255, 255, 255, 0.05);
73
- border-radius: 24px;
74
- background: linear-gradient(150deg, #111827e8, #1e293bee);
75
- box-shadow: 0 18px 44px #0209166e, inset 0 1px 0 #95c1ff1a;
76
- overflow: hidden;
77
- }
78
-
79
- .head {
80
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
81
- padding: 20px 22px;
82
- display: flex;
83
- align-items: center;
84
- justify-content: flex-start;
85
- gap: 14px;
86
- flex-wrap: wrap;
87
- }
88
-
89
- .brand {
90
- display: inline-flex;
91
- align-items: center;
92
- gap: 10px;
93
- font-family: "Sora", sans-serif;
94
- font-weight: 700;
95
- letter-spacing: 0.2px;
96
- text-decoration: none;
97
- color: var(--text);
98
- }
99
-
100
- .brand img {
101
- width: 30px;
102
- height: 30px;
103
- border-radius: 50%;
104
- border: 1px solid rgba(255, 255, 255, 0.05);
105
- object-fit: cover;
106
- }
107
-
108
- .btn {
109
- border: 1px solid var(--line);
110
- border-radius: 12px;
111
- background: #101a2f;
112
- color: var(--text);
113
- text-decoration: none;
114
- padding: 9px 12px;
115
- font-size: 14px;
116
- font-weight: 600;
117
- transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
118
- cursor: pointer;
119
- }
120
-
121
- .btn:hover {
122
- transform: translateY(-1px);
123
- border-color: #2563eb;
124
- box-shadow: 0 10px 20px #02091650;
125
- }
126
-
127
- .btn.primary {
128
- border-color: transparent;
129
- background: #22c55e;
130
- color: #0f172a;
131
- box-shadow: 0 10px 22px #22c55e30;
132
- }
133
-
134
- .btn.primary:hover {
135
- background: #16a34a;
136
- }
137
-
138
- .content {
139
- padding: 24px 22px;
140
- display: grid;
141
- gap: 14px;
142
- }
143
-
144
- h1 {
145
- margin: 0;
146
- font-family: "Sora", sans-serif;
147
- font-size: clamp(26px, 3.6vw, 36px);
148
- line-height: 1.08;
149
- letter-spacing: -0.02em;
150
- background: linear-gradient(90deg, #eef5ff 0%, #60a5fa 46%, #a78bfa 100%);
151
- -webkit-background-clip: text;
152
- background-clip: text;
153
- color: transparent;
154
- }
155
-
156
- .lead {
157
- margin: 0;
158
- color: #bfd1ea;
159
- line-height: 1.6;
160
- font-size: 16px;
161
- }
162
-
163
- .card {
164
- border: 1px solid #334f7bc7;
165
- border-radius: var(--radius);
166
- background: var(--card);
167
- padding: 16px;
168
- display: grid;
169
- gap: 10px;
170
- backdrop-filter: blur(8px);
171
- }
172
-
173
- .status {
174
- margin: 0;
175
- color: #dce8fa;
176
- font-size: 15px;
177
- line-height: 1.5;
178
- }
179
-
180
- .hint {
181
- margin: 0;
182
- color: var(--muted);
183
- font-size: 14px;
184
- line-height: 1.5;
185
- }
186
-
187
- .error {
188
- margin: 0;
189
- border: 1px solid #a74949;
190
- border-radius: 12px;
191
- background: #3b181899;
192
- color: #ffd7d7;
193
- padding: 9px 10px;
194
- font-size: 14px;
195
- }
196
-
197
- .google-area {
198
- border: 1px dashed #3c5b8d;
199
- border-radius: 14px;
200
- background: #111827a3;
201
- padding: 12px;
202
- display: grid;
203
- gap: 10px;
204
- align-items: stretch;
205
- }
206
-
207
- html:not([data-login-has-wa="1"]) #google-login-area {
208
- display: none !important;
209
- }
210
-
211
- [data-google-login-button] {
212
- width: 100%;
213
- min-height: 40px;
214
- }
215
-
216
- .google-state {
217
- margin: 0;
218
- color: var(--muted);
219
- font-size: 13px;
220
- }
221
-
222
- .summary {
223
- border: 1px solid #2b8b5d9c;
224
- border-radius: 12px;
225
- background: #11302294;
226
- padding: 10px;
227
- display: grid;
228
- gap: 6px;
229
- color: #dfffe8;
230
- font-size: 14px;
231
- }
232
-
233
- .whatsapp-cta {
234
- border: 1px solid #2d7d57a8;
235
- border-radius: 14px;
236
- background: #1130228f;
237
- padding: 12px;
238
- display: grid;
239
- gap: 10px;
240
- }
241
-
242
- html[data-login-has-wa="1"] #whatsapp-cta {
243
- display: none !important;
244
- }
245
-
246
- .whatsapp-cta p {
247
- margin: 0;
248
- color: #d5ffdf;
249
- font-size: 14px;
250
- line-height: 1.5;
251
- }
252
-
253
- .btn.whatsapp {
254
- border-color: #1e9a5f;
255
- background: linear-gradient(90deg, #22c55e, #16a34a);
256
- color: #04230f;
257
- text-align: center;
258
- }
259
-
260
- .whatsapp-meta {
261
- margin: 0;
262
- color: #b7e9ca;
263
- font-size: 13px;
264
- }
265
-
266
- .actions {
267
- display: flex;
268
- flex-wrap: wrap;
269
- gap: 8px;
270
- }
271
-
272
- @media (max-width: 620px) {
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>OmniZap System | Login</title>
7
+ <meta name="description" content="Login OmniZap System com Google para vincular sua conta ao numero do WhatsApp." />
8
+ <meta name="robots" content="noindex, nofollow" />
9
+ <meta name="theme-color" content="#0f172a" />
10
+ <link rel="canonical" href="https://omnizap.shop/login/" />
11
+ <link rel="icon" type="image/jpeg" href="https://iili.io/FC3FABe.jpg" />
12
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
13
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
14
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Sora:wght@500;600;700&display=swap" rel="stylesheet" />
15
+ <script>
16
+ (() => {
17
+ try {
18
+ const params = new URLSearchParams(window.location.search || '');
19
+ const phone = String(params.get('wa') || '').replace(/\D+/g, '');
20
+ if (phone) {
21
+ document.documentElement.setAttribute('data-login-has-wa', '1');
22
+ }
23
+ } catch {}
24
+ })();
25
+ </script>
26
+ <style>
27
+ :root {
28
+ --bg: #0f172a;
29
+ --bg-2: #111827;
30
+ --card: #1e293bcf;
31
+ --line: rgba(255, 255, 255, 0.05);
32
+ --text: #f8fafc;
33
+ --muted: #94a3b8;
34
+ --primary: #22c55e;
35
+ --error: #f87171;
36
+ --radius: 18px;
37
+ }
38
+
39
+ * {
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ html,
44
+ body {
45
+ margin: 0;
46
+ padding: 0;
47
+ min-height: 100%;
48
+ }
49
+
50
+ body {
51
+ color: var(--text);
52
+ font-family: 'Manrope', system-ui, sans-serif;
53
+ background: radial-gradient(55rem 22rem at -10% -10%, #2563eb30, transparent 60%), radial-gradient(55rem 22rem at 110% -8%, #7c3aed22, transparent 56%), linear-gradient(160deg, var(--bg), var(--bg-2));
54
+ min-height: 100vh;
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ padding: 24px 14px;
59
+ }
60
+
61
+ .page {
62
+ width: min(760px, 100%);
63
+ border: 1px solid rgba(255, 255, 255, 0.05);
64
+ border-radius: 24px;
65
+ background: linear-gradient(150deg, #111827e8, #1e293bee);
66
+ box-shadow:
67
+ 0 18px 44px #0209166e,
68
+ inset 0 1px 0 #95c1ff1a;
69
+ overflow: hidden;
70
+ }
71
+
273
72
  .head {
274
- padding: 16px;
73
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
74
+ padding: 20px 22px;
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: flex-start;
78
+ gap: 14px;
79
+ flex-wrap: wrap;
80
+ }
81
+
82
+ .brand {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ gap: 10px;
86
+ font-family: 'Sora', sans-serif;
87
+ font-weight: 700;
88
+ letter-spacing: 0.2px;
89
+ text-decoration: none;
90
+ color: var(--text);
91
+ }
92
+
93
+ .brand img {
94
+ width: 30px;
95
+ height: 30px;
96
+ border-radius: 50%;
97
+ border: 1px solid rgba(255, 255, 255, 0.05);
98
+ object-fit: cover;
99
+ }
100
+
101
+ .btn {
102
+ border: 1px solid var(--line);
103
+ border-radius: 12px;
104
+ background: #101a2f;
105
+ color: var(--text);
106
+ text-decoration: none;
107
+ padding: 9px 12px;
108
+ font-size: 14px;
109
+ font-weight: 600;
110
+ transition:
111
+ transform 0.2s ease,
112
+ border-color 0.2s ease,
113
+ box-shadow 0.2s ease;
114
+ cursor: pointer;
115
+ }
116
+
117
+ .btn:hover {
118
+ transform: translateY(-1px);
119
+ border-color: #2563eb;
120
+ box-shadow: 0 10px 20px #02091650;
121
+ }
122
+
123
+ .btn.primary {
124
+ border-color: transparent;
125
+ background: #22c55e;
126
+ color: #0f172a;
127
+ box-shadow: 0 10px 22px #22c55e30;
128
+ }
129
+
130
+ .btn.primary:hover {
131
+ background: #16a34a;
275
132
  }
276
133
 
277
134
  .content {
278
- padding: 18px 16px;
135
+ padding: 24px 22px;
136
+ display: grid;
137
+ gap: 14px;
138
+ }
139
+
140
+ h1 {
141
+ margin: 0;
142
+ font-family: 'Sora', sans-serif;
143
+ font-size: clamp(26px, 3.6vw, 36px);
144
+ line-height: 1.08;
145
+ letter-spacing: -0.02em;
146
+ background: linear-gradient(90deg, #eef5ff 0%, #60a5fa 46%, #a78bfa 100%);
147
+ -webkit-background-clip: text;
148
+ background-clip: text;
149
+ color: transparent;
150
+ }
151
+
152
+ .lead {
153
+ margin: 0;
154
+ color: #bfd1ea;
155
+ line-height: 1.6;
156
+ font-size: 16px;
157
+ }
158
+
159
+ .card {
160
+ border: 1px solid #334f7bc7;
161
+ border-radius: var(--radius);
162
+ background: var(--card);
163
+ padding: 16px;
164
+ display: grid;
165
+ gap: 10px;
166
+ backdrop-filter: blur(8px);
167
+ }
168
+
169
+ .status {
170
+ margin: 0;
171
+ color: #dce8fa;
172
+ font-size: 15px;
173
+ line-height: 1.5;
174
+ }
175
+
176
+ .hint {
177
+ margin: 0;
178
+ color: var(--muted);
179
+ font-size: 14px;
180
+ line-height: 1.5;
181
+ }
182
+
183
+ .error {
184
+ margin: 0;
185
+ border: 1px solid #a74949;
186
+ border-radius: 12px;
187
+ background: #3b181899;
188
+ color: #ffd7d7;
189
+ padding: 9px 10px;
190
+ font-size: 14px;
191
+ }
192
+
193
+ .google-area {
194
+ border: 1px dashed #3c5b8d;
195
+ border-radius: 14px;
196
+ background: #111827a3;
197
+ padding: 12px;
198
+ display: grid;
199
+ gap: 10px;
200
+ align-items: stretch;
201
+ }
202
+
203
+ html:not([data-login-has-wa='1']) #google-login-area {
204
+ display: none !important;
279
205
  }
280
206
 
281
- .actions .btn {
207
+ [data-google-login-button] {
282
208
  width: 100%;
209
+ min-height: 40px;
210
+ }
211
+
212
+ .google-state {
213
+ margin: 0;
214
+ color: var(--muted);
215
+ font-size: 13px;
216
+ }
217
+
218
+ .summary {
219
+ border: 1px solid #2b8b5d9c;
220
+ border-radius: 12px;
221
+ background: #11302294;
222
+ padding: 10px;
223
+ display: grid;
224
+ gap: 6px;
225
+ color: #dfffe8;
226
+ font-size: 14px;
227
+ }
228
+
229
+ .whatsapp-cta {
230
+ border: 1px solid #2d7d57a8;
231
+ border-radius: 14px;
232
+ background: #1130228f;
233
+ padding: 12px;
234
+ display: grid;
235
+ gap: 10px;
236
+ }
237
+
238
+ html[data-login-has-wa='1'] #whatsapp-cta {
239
+ display: none !important;
240
+ }
241
+
242
+ .whatsapp-cta p {
243
+ margin: 0;
244
+ color: #d5ffdf;
245
+ font-size: 14px;
246
+ line-height: 1.5;
247
+ }
248
+
249
+ .btn.whatsapp {
250
+ border-color: #1e9a5f;
251
+ background: linear-gradient(90deg, #22c55e, #16a34a);
252
+ color: #04230f;
283
253
  text-align: center;
284
254
  }
285
- }
286
- </style>
287
- </head>
288
- <body>
289
- <main id="login-app-root" class="page" data-api-base-path="/api/sticker-packs">
290
- <header class="head">
291
- <a href="/" class="brand">
292
- <img src="https://iili.io/FC3FABe.jpg" alt="OmniZap" loading="lazy" decoding="async" />
293
- <span>OmniZap System</span>
294
- </a>
295
- </header>
296
-
297
- <section class="content">
298
- <h1>Login da Plataforma</h1>
299
- <p class="lead">
300
- Entre com Google para vincular sua conta ao seu numero do WhatsApp e liberar os recursos web do OmniZap.
301
- </p>
302
-
303
- <article class="card">
304
- <p id="login-status" class="status">Carregando estado de login...</p>
305
- <p id="login-hint" class="hint"></p>
306
- <p id="login-error" class="error" hidden></p>
307
-
308
- <div id="google-login-area" class="google-area" hidden>
309
- <div data-google-login-button></div>
310
- <p id="google-login-state" class="google-state">Carregando login Google...</p>
311
- </div>
312
-
313
- <div id="login-summary" class="summary" hidden>
314
- <div id="login-summary-owner">WhatsApp vinculado:</div>
315
- </div>
316
-
317
- <div id="whatsapp-cta" class="whatsapp-cta" hidden>
318
- <p>Abriu esta página direto? Inicie a conversa no WhatsApp para gerar o link com seu número automaticamente.</p>
319
- <a id="whatsapp-cta-link" class="btn whatsapp" href="https://wa.me/?text=iniciar" target="_blank" rel="noreferrer noopener">
320
- Abrir WhatsApp e enviar "iniciar"
321
- </a>
322
- <p id="whatsapp-cta-meta" class="whatsapp-meta"></p>
323
- </div>
324
-
325
- <div id="login-success-actions" class="actions" hidden>
326
- <a id="login-success-chat" class="btn primary" href="https://wa.me/?text=%2Fmenu" target="_blank" rel="noreferrer noopener">
327
- Voltar ao chat do bot (/menu)
328
- </a>
329
- <a id="login-success-home" class="btn" href="/">Voltar para Home</a>
330
- </div>
331
- </article>
332
- </section>
333
- </main>
334
-
335
- <script type="module" src="/js/apps/loginApp.js?v=20260228f"></script>
336
- </body>
255
+
256
+ .whatsapp-meta {
257
+ margin: 0;
258
+ color: #b7e9ca;
259
+ font-size: 13px;
260
+ }
261
+
262
+ .actions {
263
+ display: flex;
264
+ flex-wrap: wrap;
265
+ gap: 8px;
266
+ }
267
+
268
+ @media (max-width: 620px) {
269
+ .head {
270
+ padding: 16px;
271
+ }
272
+
273
+ .content {
274
+ padding: 18px 16px;
275
+ }
276
+
277
+ .actions .btn {
278
+ width: 100%;
279
+ text-align: center;
280
+ }
281
+ }
282
+ </style>
283
+ </head>
284
+ <body>
285
+ <main id="login-app-root" class="page" data-api-base-path="/api/sticker-packs">
286
+ <header class="head">
287
+ <a href="/" class="brand">
288
+ <img src="https://iili.io/FC3FABe.jpg" alt="OmniZap" loading="lazy" decoding="async" />
289
+ <span>OmniZap System</span>
290
+ </a>
291
+ </header>
292
+
293
+ <section class="content">
294
+ <h1>Login da Plataforma</h1>
295
+ <p class="lead">Entre com Google para vincular sua conta ao seu numero do WhatsApp e liberar os recursos web do OmniZap.</p>
296
+
297
+ <article class="card">
298
+ <p id="login-status" class="status">Carregando estado de login...</p>
299
+ <p id="login-hint" class="hint"></p>
300
+ <p id="login-error" class="error" hidden></p>
301
+
302
+ <div id="google-login-area" class="google-area" hidden>
303
+ <div data-google-login-button></div>
304
+ <p id="google-login-state" class="google-state">Carregando login Google...</p>
305
+ </div>
306
+
307
+ <div id="login-summary" class="summary" hidden>
308
+ <div id="login-summary-owner">WhatsApp vinculado:</div>
309
+ </div>
310
+
311
+ <div id="whatsapp-cta" class="whatsapp-cta" hidden>
312
+ <p>Abriu esta página direto? Inicie a conversa no WhatsApp para gerar o link com seu número automaticamente.</p>
313
+ <a id="whatsapp-cta-link" class="btn whatsapp" href="https://wa.me/?text=iniciar" target="_blank" rel="noreferrer noopener"> Abrir WhatsApp e enviar "iniciar" </a>
314
+ <p id="whatsapp-cta-meta" class="whatsapp-meta"></p>
315
+ </div>
316
+
317
+ <div id="login-success-actions" class="actions" hidden>
318
+ <a id="login-success-chat" class="btn primary" href="https://wa.me/?text=%2Fmenu" target="_blank" rel="noreferrer noopener"> Voltar ao chat do bot (/menu) </a>
319
+ <a id="login-success-home" class="btn" href="/">Voltar para Home</a>
320
+ </div>
321
+ </article>
322
+ </section>
323
+ </main>
324
+
325
+ <script type="module" src="/js/apps/loginApp.js?v=20260228f"></script>
326
+ </body>
337
327
  </html>