@kaikybrofc/omnizap-system 2.2.9 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +20 -18
  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 +13 -34
  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/init.js +1 -8
  63. package/docker-compose.yml +27 -27
  64. package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +220 -0
  65. package/docs/seo/satellite-page-template.md +91 -0
  66. package/docs/seo/satellite-pages-phase1.json +349 -0
  67. package/eslint.config.js +2 -15
  68. package/index.js +8 -36
  69. package/ml/clip_classifier/README.md +4 -6
  70. package/observability/alert-rules.yml +12 -12
  71. package/observability/grafana/provisioning/dashboards/dashboards.yml +1 -1
  72. package/package.json +8 -3
  73. package/public/api-docs/index.html +224 -141
  74. package/public/bot-whatsapp-para-grupo/index.html +306 -0
  75. package/public/bot-whatsapp-sem-programar/index.html +306 -0
  76. package/public/comandos/index.html +428 -0
  77. package/public/como-automatizar-avisos-no-whatsapp/index.html +306 -0
  78. package/public/como-criar-comandos-whatsapp/index.html +306 -0
  79. package/public/como-evitar-spam-no-whatsapp/index.html +306 -0
  80. package/public/como-moderar-grupo-whatsapp/index.html +306 -0
  81. package/public/como-organizar-comunidade-whatsapp/index.html +306 -0
  82. package/public/css/github-project-panel.css +20 -15
  83. package/public/css/stickers-admin.css +55 -39
  84. package/public/css/styles.css +37 -29
  85. package/public/index.html +1060 -1417
  86. package/public/js/apps/apiDocsApp.js +36 -153
  87. package/public/js/apps/createPackApp.js +69 -332
  88. package/public/js/apps/homeApp.js +201 -434
  89. package/public/js/apps/loginApp.js +3 -12
  90. package/public/js/apps/stickersAdminApp.js +190 -181
  91. package/public/js/apps/stickersApp.js +507 -1366
  92. package/public/js/catalog.js +11 -74
  93. package/public/js/github-panel/components/ErrorState.js +1 -8
  94. package/public/js/github-panel/components/GithubProjectPanel.js +2 -9
  95. package/public/js/github-panel/components/SkeletonPanel.js +1 -11
  96. package/public/js/github-panel/components/StatCard.js +1 -7
  97. package/public/js/github-panel/vendor/react.js +1 -9
  98. package/public/js/runtime/react-runtime.js +1 -9
  99. package/public/licenca/index.html +104 -86
  100. package/public/login/index.html +315 -321
  101. package/public/melhor-bot-whatsapp-para-grupos/index.html +306 -0
  102. package/public/sitemap.xml +45 -0
  103. package/public/stickers/admin/index.html +14 -19
  104. package/public/stickers/create/index.html +39 -43
  105. package/public/stickers/index.html +97 -41
  106. package/public/termos-de-uso/index.html +142 -115
  107. package/public/user/index.html +347 -346
  108. package/scripts/cache-bust.mjs +5 -24
  109. package/scripts/generate-seo-satellite-pages.mjs +431 -0
  110. package/scripts/run-prettier-all.mjs +25 -0
  111. package/scripts/sticker-catalog-loadtest.mjs +13 -11
  112. package/scripts/sticker-worker-task.mjs +1 -4
  113. package/scripts/sync-readme-snapshot.mjs +3 -2
  114. package/server/controllers/stickerCatalogController.js +407 -704
  115. package/server/http/httpServer.js +2 -10
  116. package/server/routes/stickerCatalog/catalogHandlers/catalogAdminHttp.js +1 -8
  117. package/server/routes/stickerCatalog/catalogHandlers/catalogAuthHttp.js +1 -9
  118. package/server/routes/stickerCatalog/catalogHandlers/catalogPublicHttp.js +10 -11
  119. package/server/routes/stickerCatalog/catalogHandlers/catalogUploadHttp.js +1 -10
  120. package/server/routes/stickerCatalog/catalogRouter.js +11 -13
  121. package/kaikybrofc-omnizap-system-2.2.9.tgz +0 -0
@@ -0,0 +1,306 @@
1
+ <!doctype html>
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 organizar comunidade no WhatsApp com automacao</title>
7
+ <meta name="description" content="Veja como organizar comunidade no WhatsApp com bot pronto: regras claras, avisos automaticos e menos ruído nas conversas." />
8
+ <meta name="keywords" content="organizar comunidade whatsapp, bot para comunidade, automacao whatsapp grupo" />
9
+ <meta name="robots" content="index, follow" />
10
+ <link rel="canonical" href="https://omnizap.shop/como-organizar-comunidade-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 organizar comunidade no WhatsApp com automacao" />
17
+ <meta property="og:description" content="Veja como organizar comunidade no WhatsApp com bot pronto: regras claras, avisos automaticos e menos ruído nas conversas." />
18
+ <meta property="og:url" content="https://omnizap.shop/como-organizar-comunidade-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 organizar comunidade no WhatsApp com automacao" />
23
+ <meta name="twitter:description" content="Veja como organizar comunidade no WhatsApp com bot pronto: regras claras, avisos automaticos e menos ruído nas conversas." />
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 organizar comunidade no WhatsApp com automacao", "description": "Veja como organizar comunidade no WhatsApp com bot pronto: regras claras, avisos automaticos e menos ruído nas conversas.", "inLanguage": "pt-BR", "url": "https://omnizap.shop/como-organizar-comunidade-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": "Esse modelo serve para comunidades pequenas?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. Quanto antes automatizar, mais facil manter padrao quando a comunidade crescer." } },
35
+ { "@type": "Question", "name": "Posso usar o bot em comunidade e grupos ao mesmo tempo?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. O bot pode apoiar diferentes contextos de operacao no WhatsApp." } },
36
+ { "@type": "Question", "name": "Onde encontro os recursos extras do ecossistema?", "acceptedAnswer": { "@type": "Answer", "text": "Voce pode explorar stickers e recursos complementares em /stickers/." } }
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 organizacao</span>
241
+ <h1>Como organizar comunidade no WhatsApp de forma pratica</h1>
242
+ <p>Comunidade forte precisa de rotina. Quando a operacao depende so de humanos, a comunicacao fica inconsistente. A automacao ajuda a manter padrao e previsibilidade.</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>Estrutura minima para comunidade</h2>
252
+ <p>Toda comunidade precisa de boas-vindas, regras visiveis e canal de avisos.</p>
253
+ <p>Com bot pronto, essa estrutura roda de forma continua, mesmo com alto volume de mensagens.</p>
254
+ </section>
255
+
256
+ <section class="card">
257
+ <h2>Automacao que melhora experiencia</h2>
258
+ <p>Ajuste respostas para perguntas recorrentes e reduza friccao de suporte.</p>
259
+ <p>Use lembretes automaticos para horarios, eventos e combinados da comunidade.</p>
260
+ <ul>
261
+ <li>Menos ruido</li>
262
+ <li>Mais clareza</li>
263
+ <li>Tempo da equipe preservado</li>
264
+ </ul>
265
+ </section>
266
+
267
+ <section class="card">
268
+ <h2>Escala sem perder qualidade</h2>
269
+ <p>Quando os processos basicos estao automatizados, a comunidade cresce com menos caos.</p>
270
+ <p>Isso permite que admins foquem em conteudo, relacionamento e crescimento.</p>
271
+ </section>
272
+
273
+ <section class="card">
274
+ <h2>Perguntas frequentes</h2>
275
+ <div class="faq-list">
276
+ <details class="faq-item">
277
+ <summary>Esse modelo serve para comunidades pequenas?</summary>
278
+ <p>Sim. Quanto antes automatizar, mais facil manter padrao quando a comunidade crescer.</p>
279
+ </details>
280
+ <details class="faq-item">
281
+ <summary>Posso usar o bot em comunidade e grupos ao mesmo tempo?</summary>
282
+ <p>Sim. O bot pode apoiar diferentes contextos de operacao no WhatsApp.</p>
283
+ </details>
284
+ <details class="faq-item">
285
+ <summary>Onde encontro os recursos extras do ecossistema?</summary>
286
+ <p>Voce pode explorar stickers e recursos complementares em /stickers/.</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-automatizar-avisos-no-whatsapp/">Automatizar avisos no WhatsApp</a>
300
+ <a href="/como-moderar-grupo-whatsapp/">Moderacao de grupos</a>
301
+ <a href="/bot-whatsapp-para-grupo/">Bot para grupo</a>
302
+ </div>
303
+ </section>
304
+ </main>
305
+ </body>
306
+ </html>
@@ -1,11 +1,11 @@
1
1
  :root {
2
- --gh-bg: rgba(14, 22, 41, 0.9);
3
- --gh-card: rgba(20, 30, 54, 0.86);
4
- --gh-border: #2a3b60;
5
- --gh-border-hover: #47689a;
6
- --gh-text: #dfe8f7;
7
- --gh-muted: #9fb0cc;
8
- --gh-accent: #38bdf8;
2
+ --gh-bg: rgba(15, 23, 42, 0.9);
3
+ --gh-card: rgba(30, 41, 59, 0.86);
4
+ --gh-border: rgba(255, 255, 255, 0.05);
5
+ --gh-border-hover: #2563eb;
6
+ --gh-text: #f8fafc;
7
+ --gh-muted: #94a3b8;
8
+ --gh-accent: #2563eb;
9
9
  --gh-accent-2: #22c55e;
10
10
  }
11
11
 
@@ -25,7 +25,7 @@
25
25
 
26
26
  .ghp-title {
27
27
  margin: 0 0 2px;
28
- font-family: "Sora", sans-serif;
28
+ font-family: 'Sora', sans-serif;
29
29
  font-size: 24px;
30
30
  }
31
31
 
@@ -109,11 +109,12 @@
109
109
  align-content: start;
110
110
  border: 1px solid var(--gh-border);
111
111
  border-radius: 14px;
112
- background:
113
- radial-gradient(120% 120% at 0% 0%, #38bdf816, transparent 60%),
114
- linear-gradient(160deg, var(--gh-card), #101a31);
112
+ background: radial-gradient(120% 120% at 0% 0%, #7c3aed16, transparent 60%), linear-gradient(160deg, var(--gh-card), #101a31);
115
113
  padding: 14px;
116
- transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
114
+ transition:
115
+ border-color 0.2s ease,
116
+ transform 0.2s ease,
117
+ box-shadow 0.2s ease;
117
118
  }
118
119
 
119
120
  .ghp-stat-card:hover {
@@ -137,7 +138,7 @@
137
138
  color: var(--gh-muted);
138
139
  font-size: 12px;
139
140
  text-transform: uppercase;
140
- letter-spacing: .35px;
141
+ letter-spacing: 0.35px;
141
142
  }
142
143
 
143
144
  .ghp-stat-value {
@@ -273,8 +274,12 @@
273
274
  }
274
275
 
275
276
  @keyframes ghp-shimmer {
276
- 0% { background-position: 100% 0; }
277
- 100% { background-position: -100% 0; }
277
+ 0% {
278
+ background-position: 100% 0;
279
+ }
280
+ 100% {
281
+ background-position: -100% 0;
282
+ }
278
283
  }
279
284
 
280
285
  .ghp-repo-link:focus-visible,
@@ -1,17 +1,17 @@
1
1
  :root {
2
- --bg: #0b1220;
3
- --bg-soft: #0f172a;
4
- --card: #111a2b;
5
- --card-soft: #162238;
2
+ --bg: #0f172a;
3
+ --bg-soft: #111827;
4
+ --card: #1e293b;
5
+ --card-soft: #111827;
6
6
  --line: rgba(255, 255, 255, 0.05);
7
7
  --line-strong: rgba(255, 255, 255, 0.12);
8
- --accent: #14b8a6;
9
- --accent-soft: rgba(20, 184, 166, 0.14);
8
+ --accent: #2563eb;
9
+ --accent-soft: rgba(37, 99, 235, 0.14);
10
10
  --danger: #f43f5e;
11
11
  --danger-soft: rgba(244, 63, 94, 0.14);
12
12
  --warning: #f59e0b;
13
13
  --warning-soft: rgba(245, 158, 11, 0.12);
14
- --text: #e6edf3;
14
+ --text: #f8fafc;
15
15
  --text-soft: #94a3b8;
16
16
  --text-muted: #64748b;
17
17
  --radius-sm: 10px;
@@ -33,11 +33,14 @@ body {
33
33
  }
34
34
 
35
35
  body {
36
- font-family: 'Manrope', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
37
- background:
38
- radial-gradient(1300px 660px at 12% -12%, rgba(20, 184, 166, 0.14), transparent 52%),
39
- radial-gradient(900px 500px at 92% -18%, rgba(59, 130, 246, 0.1), transparent 55%),
40
- var(--bg);
36
+ font-family:
37
+ 'Manrope',
38
+ ui-sans-serif,
39
+ system-ui,
40
+ -apple-system,
41
+ 'Segoe UI',
42
+ sans-serif;
43
+ background: radial-gradient(1300px 660px at 12% -12%, rgba(37, 99, 235, 0.14), transparent 52%), radial-gradient(900px 500px at 92% -18%, rgba(59, 130, 246, 0.1), transparent 55%), var(--bg);
41
44
  color: var(--text);
42
45
  line-height: 1.4;
43
46
  }
@@ -47,7 +50,7 @@ a {
47
50
  }
48
51
 
49
52
  a:hover {
50
- color: #22d3ee;
53
+ color: #7c3aed;
51
54
  }
52
55
 
53
56
  button,
@@ -61,13 +64,13 @@ button,
61
64
  input,
62
65
  textarea,
63
66
  a {
64
- -webkit-tap-highlight-color: rgba(20, 184, 166, 0.16);
67
+ -webkit-tap-highlight-color: rgba(37, 99, 235, 0.16);
65
68
  }
66
69
 
67
70
  button:focus-visible,
68
71
  input:focus-visible,
69
72
  a:focus-visible {
70
- outline: 2px solid rgba(20, 184, 166, 0.62);
73
+ outline: 2px solid rgba(37, 99, 235, 0.62);
71
74
  outline-offset: 2px;
72
75
  }
73
76
 
@@ -110,7 +113,7 @@ a:focus-visible {
110
113
  height: 10px;
111
114
  border-radius: 999px;
112
115
  background: var(--accent);
113
- box-shadow: 0 0 0 5px rgba(20, 184, 166, 0.16);
116
+ box-shadow: 0 0 0 5px rgba(37, 99, 235, 0.16);
114
117
  }
115
118
 
116
119
  .brand-title {
@@ -187,18 +190,22 @@ a:focus-visible {
187
190
  font-weight: 700;
188
191
  text-align: left;
189
192
  cursor: pointer;
190
- transition: border-color var(--transition), color var(--transition), background-color var(--transition), transform var(--transition);
193
+ transition:
194
+ border-color var(--transition),
195
+ color var(--transition),
196
+ background-color var(--transition),
197
+ transform var(--transition);
191
198
  }
192
199
 
193
200
  .nav-item:hover {
194
- border-color: rgba(20, 184, 166, 0.28);
201
+ border-color: rgba(37, 99, 235, 0.28);
195
202
  color: var(--text);
196
203
  }
197
204
 
198
205
  .nav-item.active {
199
- border-color: rgba(20, 184, 166, 0.5);
200
- color: #dff8f4;
201
- background: rgba(20, 184, 166, 0.18);
206
+ border-color: rgba(37, 99, 235, 0.5);
207
+ color: #dbeafe;
208
+ background: rgba(37, 99, 235, 0.18);
202
209
  }
203
210
 
204
211
  .nav-count {
@@ -242,7 +249,10 @@ a:focus-visible {
242
249
  box-shadow: var(--shadow-1);
243
250
  padding: 14px;
244
251
  min-width: 0;
245
- transition: transform var(--transition), border-color var(--transition), background-color var(--transition);
252
+ transition:
253
+ transform var(--transition),
254
+ border-color var(--transition),
255
+ background-color var(--transition);
246
256
  }
247
257
 
248
258
  .metric-card:hover {
@@ -281,7 +291,7 @@ a:focus-visible {
281
291
  }
282
292
 
283
293
  .trend-up {
284
- color: #2dd4bf;
294
+ color: #2563eb;
285
295
  }
286
296
 
287
297
  .trend-down {
@@ -301,7 +311,7 @@ a:focus-visible {
301
311
  .sparkbar {
302
312
  width: 5px;
303
313
  border-radius: 999px;
304
- background: linear-gradient(180deg, #5eead4, #0891b2);
314
+ background: linear-gradient(180deg, #60a5fa, #6d28d9);
305
315
  opacity: 0.92;
306
316
  }
307
317
 
@@ -348,7 +358,10 @@ a:focus-visible {
348
358
  font-weight: 700;
349
359
  white-space: nowrap;
350
360
  cursor: pointer;
351
- transition: background-color var(--transition), border-color var(--transition), color var(--transition);
361
+ transition:
362
+ background-color var(--transition),
363
+ border-color var(--transition),
364
+ color var(--transition);
352
365
  }
353
366
 
354
367
  .tab-btn:hover {
@@ -357,8 +370,8 @@ a:focus-visible {
357
370
  }
358
371
 
359
372
  .tab-btn.active {
360
- border-color: rgba(20, 184, 166, 0.46);
361
- background: rgba(20, 184, 166, 0.16);
373
+ border-color: rgba(37, 99, 235, 0.46);
374
+ background: rgba(37, 99, 235, 0.16);
362
375
  color: #dcfffa;
363
376
  }
364
377
 
@@ -436,7 +449,10 @@ a:focus-visible {
436
449
  background: rgba(15, 23, 42, 0.88);
437
450
  color: var(--text);
438
451
  padding: 0 12px;
439
- transition: border-color var(--transition), background-color var(--transition), box-shadow var(--transition);
452
+ transition:
453
+ border-color var(--transition),
454
+ background-color var(--transition),
455
+ box-shadow var(--transition);
440
456
  }
441
457
 
442
458
  .search-input::placeholder {
@@ -448,8 +464,8 @@ a:focus-visible {
448
464
  }
449
465
 
450
466
  .search-input:focus-visible {
451
- border-color: rgba(20, 184, 166, 0.64);
452
- box-shadow: 0 0 0 3px rgba(20, 184, 166, 0.14);
467
+ border-color: rgba(37, 99, 235, 0.64);
468
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.14);
453
469
  }
454
470
 
455
471
  .primary-btn,
@@ -487,7 +503,7 @@ a:focus-visible {
487
503
  }
488
504
 
489
505
  .primary-btn:hover:not(:disabled) {
490
- background: #2dd4bf;
506
+ background: #2563eb;
491
507
  transform: translateY(-1px);
492
508
  }
493
509
 
@@ -694,9 +710,9 @@ a[aria-disabled='true'] {
694
710
  }
695
711
 
696
712
  .status-success {
697
- border-color: rgba(45, 212, 191, 0.36);
698
- background: rgba(20, 184, 166, 0.14);
699
- color: #99f6e4;
713
+ border-color: rgba(37, 99, 235, 0.36);
714
+ background: rgba(37, 99, 235, 0.14);
715
+ color: #c4b5fd;
700
716
  }
701
717
 
702
718
  .status-danger {
@@ -874,7 +890,7 @@ a[aria-disabled='true'] {
874
890
  .progress-bar {
875
891
  display: block;
876
892
  height: 100%;
877
- background: linear-gradient(90deg, #2dd4bf, #14b8a6);
893
+ background: linear-gradient(90deg, #2563eb, #7c3aed);
878
894
  }
879
895
 
880
896
  .progress-meta {
@@ -944,8 +960,8 @@ a[aria-disabled='true'] {
944
960
 
945
961
  .account-box {
946
962
  border-radius: 12px;
947
- border: 1px solid rgba(20, 184, 166, 0.32);
948
- background: rgba(20, 184, 166, 0.1);
963
+ border: 1px solid rgba(37, 99, 235, 0.32);
964
+ background: rgba(37, 99, 235, 0.1);
949
965
  padding: 10px;
950
966
  }
951
967
 
@@ -1047,9 +1063,9 @@ a[aria-disabled='true'] {
1047
1063
  }
1048
1064
 
1049
1065
  .toast.success {
1050
- border-color: rgba(20, 184, 166, 0.42);
1066
+ border-color: rgba(37, 99, 235, 0.42);
1051
1067
  color: #bff8f1;
1052
- background: rgba(20, 184, 166, 0.16);
1068
+ background: rgba(37, 99, 235, 0.16);
1053
1069
  }
1054
1070
 
1055
1071
  .toast.danger {