@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
@@ -90,51 +90,11 @@
90
90
  packPageWhatsApp: document.getElementById('pack-page-whatsapp'),
91
91
  };
92
92
 
93
- if (
94
- !els.hero ||
95
- !els.form ||
96
- !els.search ||
97
- !els.visibility ||
98
- !els.categories ||
99
- !els.categoriesPicker ||
100
- !els.categoriesSearch ||
101
- !els.categoriesChips ||
102
- !els.categoriesOptions ||
103
- !els.status ||
104
- !els.grid ||
105
- !els.more ||
106
- !els.orphanStatus ||
107
- !els.orphanGrid ||
108
- !els.orphanPrev ||
109
- !els.orphanNext ||
110
- !els.orphanPageInfo ||
111
- !els.panel ||
112
- !els.panelTitle ||
113
- !els.panelSub ||
114
- !els.panelChip ||
115
- !els.panelError ||
116
- !els.panelPrev ||
117
- !els.panelNext ||
118
- !els.panelPageInfo ||
119
- !els.copy ||
120
- !els.useWhatsAppLink ||
121
- !els.stickers ||
122
- !els.packPage ||
123
- !els.packPageTitle ||
124
- !els.packPageSub ||
125
- !els.packPageChip ||
126
- !els.packPageStatus ||
127
- !els.packPageGrid ||
128
- !els.packPageBack ||
129
- !els.packPageCopy ||
130
- !els.packPageWhatsApp
131
- ) {
93
+ if (!els.hero || !els.form || !els.search || !els.visibility || !els.categories || !els.categoriesPicker || !els.categoriesSearch || !els.categoriesChips || !els.categoriesOptions || !els.status || !els.grid || !els.more || !els.orphanStatus || !els.orphanGrid || !els.orphanPrev || !els.orphanNext || !els.orphanPageInfo || !els.panel || !els.panelTitle || !els.panelSub || !els.panelChip || !els.panelError || !els.panelPrev || !els.panelNext || !els.panelPageInfo || !els.copy || !els.useWhatsAppLink || !els.stickers || !els.packPage || !els.packPageTitle || !els.packPageSub || !els.packPageChip || !els.packPageStatus || !els.packPageGrid || !els.packPageBack || !els.packPageCopy || !els.packPageWhatsApp) {
132
94
  return;
133
95
  }
134
96
 
135
- const panelModal = window.bootstrap?.Modal
136
- ? window.bootstrap.Modal.getOrCreateInstance(els.panel)
137
- : null;
97
+ const panelModal = window.bootstrap?.Modal ? window.bootstrap.Modal.getOrCreateInstance(els.panel) : null;
138
98
 
139
99
  let shouldReplaceStateOnHide = false;
140
100
 
@@ -208,10 +168,7 @@
208
168
  chip.className = 'category-chip';
209
169
  chip.dataset.value = value;
210
170
  chip.setAttribute('aria-label', 'Remover categoria ' + (entry?.label || value));
211
- chip.innerHTML =
212
- '<span class="category-chip-label">' +
213
- (entry?.label || value) +
214
- '</span><i class="fa-solid fa-xmark category-chip-remove" aria-hidden="true"></i>';
171
+ chip.innerHTML = '<span class="category-chip-label">' + (entry?.label || value) + '</span><i class="fa-solid fa-xmark category-chip-remove" aria-hidden="true"></i>';
215
172
  els.categoriesChips.appendChild(chip);
216
173
  });
217
174
  };
@@ -240,10 +197,7 @@
240
197
  button.type = 'button';
241
198
  button.className = 'category-option' + (selected.has(entry.value) ? ' selected' : '');
242
199
  button.dataset.value = entry.value;
243
- button.innerHTML =
244
- '<span class="category-option-label">' +
245
- entry.label +
246
- '</span><i class="fa-solid fa-check category-option-check" aria-hidden="true"></i>';
200
+ button.innerHTML = '<span class="category-option-label">' + entry.label + '</span><i class="fa-solid fa-check category-option-check" aria-hidden="true"></i>';
247
201
  els.categoriesOptions.appendChild(button);
248
202
  });
249
203
  };
@@ -401,9 +355,7 @@
401
355
  .map(([label]) => toTagToken(label))
402
356
  .filter(Boolean);
403
357
 
404
- const merged = [...rankedFromScores, ...classificationTags, ...explicitTags]
405
- .map((tag) => toTagToken(tag))
406
- .filter(Boolean);
358
+ const merged = [...rankedFromScores, ...classificationTags, ...explicitTags].map((tag) => toTagToken(tag)).filter(Boolean);
407
359
 
408
360
  return Array.from(new Set(merged)).slice(0, 3);
409
361
  };
@@ -430,9 +382,7 @@
430
382
  const explicitTags = Array.isArray(pack?.tags) ? pack.tags : [];
431
383
  const classificationTags = Array.isArray(pack?.classification?.tags) ? pack.classification.tags : [];
432
384
 
433
- const merged = [...classificationTags, ...explicitTags]
434
- .map((tag) => toTagToken(tag))
435
- .filter(Boolean);
385
+ const merged = [...classificationTags, ...explicitTags].map((tag) => toTagToken(tag)).filter(Boolean);
436
386
 
437
387
  return Array.from(new Set(merged)).slice(0, 3);
438
388
  };
@@ -473,8 +423,7 @@
473
423
  const visibilityBadge = document.createElement('span');
474
424
  visibilityBadge.className = 'pack-visibility-badge';
475
425
  const visibility = String(pack.visibility || '').toLowerCase();
476
- visibilityBadge.textContent =
477
- visibility === 'public' ? 'Público' : visibility === 'unlisted' ? 'Não listado' : 'Privado';
426
+ visibilityBadge.textContent = visibility === 'public' ? 'Público' : visibility === 'unlisted' ? 'Não listado' : 'Privado';
478
427
 
479
428
  const countBadge = document.createElement('span');
480
429
  countBadge.className = 'pack-count-badge';
@@ -546,13 +495,7 @@
546
495
  for (let index = 0; index < count; index += 1) {
547
496
  const col = document.createElement('div');
548
497
  col.className = 'col-4 col-sm-6 col-md-4 col-lg-3';
549
- col.innerHTML =
550
- '<div class="card h-100 bg-dark text-light shadow-sm pack-card">' +
551
- '<div class="card-body d-flex flex-column gap-2">' +
552
- '<div class="skeleton skeleton-thumb"></div>' +
553
- '<div class="skeleton skeleton-line"></div>' +
554
- '<div class="skeleton skeleton-line short"></div>' +
555
- '</div></div>';
498
+ col.innerHTML = '<div class="card h-100 bg-dark text-light shadow-sm pack-card">' + '<div class="card-body d-flex flex-column gap-2">' + '<div class="skeleton skeleton-thumb"></div>' + '<div class="skeleton skeleton-line"></div>' + '<div class="skeleton skeleton-line short"></div>' + '</div></div>';
556
499
  els.grid.appendChild(col);
557
500
  }
558
501
  };
@@ -607,8 +550,7 @@
607
550
 
608
551
  els.packPageTitle.textContent = pack?.name || 'Pack';
609
552
  els.packPageSub.textContent = (pack?.publisher || '-') + ' | ' + (pack?.description || 'Sem descrição');
610
- els.packPageChip.textContent =
611
- String(pack?.sticker_count || items.length || 0) + ' itens | ' + (pack?.visibility || '-') + ' | ' + (pack?.pack_key || '-');
553
+ els.packPageChip.textContent = String(pack?.sticker_count || items.length || 0) + ' itens | ' + (pack?.visibility || '-') + ' | ' + (pack?.pack_key || '-');
612
554
  applyWhatsAppLink(els.packPageWhatsApp, pack?.whatsapp?.url);
613
555
 
614
556
  els.packPageGrid.innerHTML = '';
@@ -643,11 +585,7 @@
643
585
  for (let index = 0; index < count; index += 1) {
644
586
  const col = document.createElement('div');
645
587
  col.className = 'col-6 col-md-3 col-lg-2';
646
- col.innerHTML =
647
- '<article class="orphan-card card h-100"><div class="card-body p-2">' +
648
- '<div class="skeleton skeleton-orphan"></div>' +
649
- '<div class="skeleton skeleton-line short mt-2"></div>' +
650
- '</div></article>';
588
+ col.innerHTML = '<article class="orphan-card card h-100"><div class="card-body p-2">' + '<div class="skeleton skeleton-orphan"></div>' + '<div class="skeleton skeleton-line short mt-2"></div>' + '</div></article>';
651
589
  els.orphanGrid.appendChild(col);
652
590
  }
653
591
  };
@@ -779,8 +717,7 @@
779
717
 
780
718
  els.panelPrev.disabled = state.panelPagination.page <= 1;
781
719
  els.panelNext.disabled = state.panelPagination.page >= totalPages;
782
- els.panelPageInfo.textContent =
783
- 'Página ' + state.panelPagination.page + ' de ' + totalPages + ' - ' + safeTotal + ' stickers';
720
+ els.panelPageInfo.textContent = 'Página ' + state.panelPagination.page + ' de ' + totalPages + ' - ' + safeTotal + ' stickers';
784
721
  };
785
722
 
786
723
  const renderPanelStickersPage = () => {
@@ -3,14 +3,7 @@ import { React, memo } from '../vendor/react.js';
3
3
  const h = React.createElement;
4
4
 
5
5
  function ErrorStateComponent({ message, onRetry, isRateLimited }) {
6
- return h(
7
- 'section',
8
- { className: 'ghp-error', role: 'alert' },
9
- h('h3', null, 'Não foi possível carregar os dados do GitHub'),
10
- h('p', null, message || 'Tente novamente em alguns instantes.'),
11
- isRateLimited ? h('p', { className: 'ghp-rate-limit' }, 'Limite de requisições do GitHub atingido. Tente novamente em breve.') : null,
12
- h('button', { type: 'button', className: 'ghp-retry', onClick: onRetry }, 'Tentar novamente'),
13
- );
6
+ return h('section', { className: 'ghp-error', role: 'alert' }, h('h3', null, 'Não foi possível carregar os dados do GitHub'), h('p', null, message || 'Tente novamente em alguns instantes.'), isRateLimited ? h('p', { className: 'ghp-rate-limit' }, 'Limite de requisições do GitHub atingido. Tente novamente em breve.') : null, h('button', { type: 'button', className: 'ghp-retry', onClick: onRetry }, 'Tentar novamente'));
14
7
  }
15
8
 
16
9
  export const ErrorState = memo(ErrorStateComponent);
@@ -92,15 +92,8 @@ export function GithubProjectPanel({ owner, repo, endpoint }) {
92
92
  ),
93
93
  ),
94
94
  ),
95
- error
96
- ? h('p', { className: 'ghp-inline-warning', role: 'status' }, error.rateLimited ? 'Limite da API do GitHub atingido; exibindo cache local.' : 'Exibindo último snapshot disponível.')
97
- : null,
95
+ error ? h('p', { className: 'ghp-inline-warning', role: 'status' }, error.rateLimited ? 'Limite da API do GitHub atingido; exibindo cache local.' : 'Exibindo último snapshot disponível.') : null,
98
96
  h('div', { className: 'ghp-stat-grid' }, ...statCards.map((card) => h(StatCard, { key: card.label, ...card }))),
99
- h(
100
- 'div',
101
- { className: 'ghp-list-grid' },
102
- h('section', { className: 'ghp-list-card' }, h('h4', { className: 'ghp-list-title' }, 'Últimos Commits'), h(CommitList, { items: data?.latest_commits || [], formatDate: fmtDate })),
103
- h('section', { className: 'ghp-list-card' }, h('h4', { className: 'ghp-list-title' }, 'Últimas Releases'), h(ReleaseList, { items: data?.latest_releases || [], formatDate: fmtDate })),
104
- ),
97
+ h('div', { className: 'ghp-list-grid' }, h('section', { className: 'ghp-list-card' }, h('h4', { className: 'ghp-list-title' }, 'Últimos Commits'), h(CommitList, { items: data?.latest_commits || [], formatDate: fmtDate })), h('section', { className: 'ghp-list-card' }, h('h4', { className: 'ghp-list-title' }, 'Últimas Releases'), h(ReleaseList, { items: data?.latest_releases || [], formatDate: fmtDate }))),
105
98
  );
106
99
  }
@@ -6,17 +6,7 @@ function SkeletonPanelComponent() {
6
6
  const statNodes = Array.from({ length: 10 }).map((_, index) => h('div', { key: `s-${index}`, className: 'ghp-skeleton-card' }));
7
7
  const listNodes = Array.from({ length: 4 }).map((_, index) => h('li', { key: `l-${index}`, className: 'ghp-skeleton-line' }));
8
8
 
9
- return h(
10
- 'section',
11
- { className: 'ghp-panel', 'aria-busy': 'true', 'aria-live': 'polite' },
12
- h('div', { className: 'ghp-stat-grid' }, ...statNodes),
13
- h(
14
- 'div',
15
- { className: 'ghp-list-grid' },
16
- h('div', { className: 'ghp-list-card' }, h('div', { className: 'ghp-skeleton-title' }), h('ul', { className: 'ghp-list' }, ...listNodes)),
17
- h('div', { className: 'ghp-list-card' }, h('div', { className: 'ghp-skeleton-title' }), h('ul', { className: 'ghp-list' }, ...listNodes)),
18
- ),
19
- );
9
+ return h('section', { className: 'ghp-panel', 'aria-busy': 'true', 'aria-live': 'polite' }, h('div', { className: 'ghp-stat-grid' }, ...statNodes), h('div', { className: 'ghp-list-grid' }, h('div', { className: 'ghp-list-card' }, h('div', { className: 'ghp-skeleton-title' }), h('ul', { className: 'ghp-list' }, ...listNodes)), h('div', { className: 'ghp-list-card' }, h('div', { className: 'ghp-skeleton-title' }), h('ul', { className: 'ghp-list' }, ...listNodes))));
20
10
  }
21
11
 
22
12
  export const SkeletonPanel = memo(SkeletonPanelComponent);
@@ -3,13 +3,7 @@ import { React, memo } from '../vendor/react.js';
3
3
  const h = React.createElement;
4
4
 
5
5
  function StatCardComponent({ label, value, detail, iconClass }) {
6
- return h(
7
- 'article',
8
- { className: 'ghp-stat-card' },
9
- h('header', { className: 'ghp-stat-head' }, h('span', { className: 'ghp-stat-label' }, label), iconClass ? h('i', { className: iconClass, 'aria-hidden': 'true' }) : null),
10
- h('p', { className: 'ghp-stat-value' }, value),
11
- h('p', { className: 'ghp-stat-detail', title: detail || '' }, detail || ' '),
12
- );
6
+ return h('article', { className: 'ghp-stat-card' }, h('header', { className: 'ghp-stat-head' }, h('span', { className: 'ghp-stat-label' }, label), iconClass ? h('i', { className: iconClass, 'aria-hidden': 'true' }) : null), h('p', { className: 'ghp-stat-value' }, value), h('p', { className: 'ghp-stat-detail', title: detail || '' }, detail || ' '));
13
7
  }
14
8
 
15
9
  export const StatCard = memo(StatCardComponent);
@@ -1,11 +1,3 @@
1
- export {
2
- default as React,
3
- memo,
4
- useMemo,
5
- useCallback,
6
- useEffect,
7
- useRef,
8
- useState,
9
- } from 'https://esm.sh/react@18.3.1';
1
+ export { default as React, memo, useMemo, useCallback, useEffect, useRef, useState } from 'https://esm.sh/react@18.3.1';
10
2
 
11
3
  export { createRoot } from 'https://esm.sh/react-dom@18.3.1/client';
@@ -7,14 +7,6 @@ if (typeof document !== 'undefined' && !window.__omnizapTwindReady) {
7
7
  window.__omnizapTwindReady = true;
8
8
  }
9
9
 
10
- export {
11
- default as React,
12
- useCallback,
13
- useEffect,
14
- useMemo,
15
- useRef,
16
- useState,
17
- memo,
18
- } from 'https://esm.sh/react@18.3.1';
10
+ export { default as React, useCallback, useEffect, useMemo, useRef, useState, memo } from 'https://esm.sh/react@18.3.1';
19
11
 
20
12
  export { createRoot } from 'https://esm.sh/react-dom@18.3.1/client';
@@ -1,89 +1,106 @@
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>Licença | OmniZap System</title>
7
- <meta name="description" content="Informações de licença do OmniZap System (MIT License)." />
8
- <meta name="robots" content="index, follow" />
9
- <link rel="canonical" href="https://omnizap.shop/licenca/" />
10
- <link rel="icon" type="image/jpeg" href="https://iili.io/FC3FABe.jpg" />
11
- <link rel="apple-touch-icon" href="https://iili.io/FC3FABe.jpg" />
12
- <style>
13
- :root {
14
- --bg: #0b1020;
15
- --bg-2: #121a2f;
16
- --line: #2a3b60;
17
- --text: #e6edf7;
18
- --muted: #9fb0cc;
19
- --card: #141e36cc;
20
- }
21
- * { box-sizing: border-box; }
22
- body {
23
- margin: 0;
24
- font-family: "Manrope", system-ui, -apple-system, sans-serif;
25
- color: var(--text);
26
- background:
27
- radial-gradient(58rem 24rem at -8% -12%, #22c55e26, transparent 60%),
28
- radial-gradient(58rem 24rem at 112% -10%, #38bdf822, transparent 58%),
29
- linear-gradient(165deg, var(--bg), var(--bg-2));
30
- }
31
- .wrap { width: min(960px, 92vw); margin: 0 auto; padding: 24px 0 42px; }
32
- .top {
33
- display: flex;
34
- gap: 10px;
35
- flex-wrap: wrap;
36
- margin-bottom: 16px;
37
- }
38
- .top a {
39
- color: var(--text);
40
- text-decoration: none;
41
- border: 1px solid var(--line);
42
- border-radius: 10px;
43
- padding: 8px 12px;
44
- background: #111a2d;
45
- }
46
- .card {
47
- border: 1px solid var(--line);
48
- border-radius: 14px;
49
- background: var(--card);
50
- padding: 18px;
51
- margin-bottom: 12px;
52
- }
53
- h1, h2 { margin: 0 0 10px; }
54
- h1 { font-size: clamp(28px, 4.2vw, 38px); }
55
- p { color: var(--muted); line-height: 1.6; margin: 0 0 10px; }
56
- pre {
57
- margin: 0;
58
- white-space: pre-wrap;
59
- line-height: 1.5;
60
- color: #d6e4fa;
61
- border: 1px solid #314669;
62
- border-radius: 12px;
63
- background: #0f1729;
64
- padding: 14px;
65
- overflow: auto;
66
- }
67
- </style>
68
- </head>
69
- <body>
70
- <main class="wrap">
71
- <nav class="top" aria-label="Navegação">
72
- <a href="/">Início</a>
73
- <a href="/stickers/">Stickers</a>
74
- <a href="/api-docs/">API</a>
75
- <a href="/termos-de-uso/">Termos de Uso</a>
76
- </nav>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Licença | OmniZap System</title>
7
+ <meta name="description" content="Informações de licença do OmniZap System (MIT License)." />
8
+ <meta name="robots" content="index, follow" />
9
+ <link rel="canonical" href="https://omnizap.shop/licenca/" />
10
+ <link rel="icon" type="image/jpeg" href="https://iili.io/FC3FABe.jpg" />
11
+ <link rel="apple-touch-icon" href="https://iili.io/FC3FABe.jpg" />
12
+ <style>
13
+ :root {
14
+ --bg: #0f172a;
15
+ --bg-2: #111827;
16
+ --line: rgba(255, 255, 255, 0.05);
17
+ --text: #f8fafc;
18
+ --muted: #94a3b8;
19
+ --card: #1e293bcc;
20
+ }
21
+ * {
22
+ box-sizing: border-box;
23
+ }
24
+ body {
25
+ margin: 0;
26
+ font-family:
27
+ 'Manrope',
28
+ system-ui,
29
+ -apple-system,
30
+ sans-serif;
31
+ color: var(--text);
32
+ background: radial-gradient(58rem 24rem at -8% -12%, #2563eb26, transparent 60%), radial-gradient(58rem 24rem at 112% -10%, #7c3aed22, transparent 58%), linear-gradient(165deg, var(--bg), var(--bg-2));
33
+ }
34
+ .wrap {
35
+ width: min(960px, 92vw);
36
+ margin: 0 auto;
37
+ padding: 24px 0 42px;
38
+ }
39
+ .top {
40
+ display: flex;
41
+ gap: 10px;
42
+ flex-wrap: wrap;
43
+ margin-bottom: 16px;
44
+ }
45
+ .top a {
46
+ color: var(--text);
47
+ text-decoration: none;
48
+ border: 1px solid var(--line);
49
+ border-radius: 10px;
50
+ padding: 8px 12px;
51
+ background: #111827;
52
+ }
53
+ .card {
54
+ border: 1px solid var(--line);
55
+ border-radius: 14px;
56
+ background: var(--card);
57
+ padding: 18px;
58
+ margin-bottom: 12px;
59
+ }
60
+ h1,
61
+ h2 {
62
+ margin: 0 0 10px;
63
+ }
64
+ h1 {
65
+ font-size: clamp(28px, 4.2vw, 38px);
66
+ }
67
+ p {
68
+ color: var(--muted);
69
+ line-height: 1.6;
70
+ margin: 0 0 10px;
71
+ }
72
+ pre {
73
+ margin: 0;
74
+ white-space: pre-wrap;
75
+ line-height: 1.5;
76
+ color: #d6e4fa;
77
+ border: 1px solid #314669;
78
+ border-radius: 12px;
79
+ background: #0f1729;
80
+ padding: 14px;
81
+ overflow: auto;
82
+ }
83
+ </style>
84
+ </head>
85
+ <body>
86
+ <main class="wrap">
87
+ <nav class="top" aria-label="Navegação">
88
+ <a href="/">Início</a>
89
+ <a href="/stickers/">Stickers</a>
90
+ <a href="/api-docs/">API</a>
91
+ <a href="/termos-de-uso/">Termos de Uso</a>
92
+ </nav>
77
93
 
78
- <section class="card">
79
- <h1>Licença</h1>
80
- <p>Este projeto é distribuído sob a licença MIT. Abaixo está o texto da licença usada no repositório.</p>
81
- <p>Copyright (c) 2025 Kaiky Brito</p>
82
- </section>
94
+ <section class="card">
95
+ <h1>Licença</h1>
96
+ <p>Este projeto é distribuído sob a licença MIT. Abaixo está o texto da licença usada no repositório.</p>
97
+ <p>Copyright (c) 2025 Kaiky Brito</p>
98
+ </section>
83
99
 
84
- <section class="card">
85
- <h2>MIT License (texto original)</h2>
86
- <pre>Permission is hereby granted, free of charge, to any person obtaining a copy
100
+ <section class="card">
101
+ <h2>MIT License (texto original)</h2>
102
+ <pre>
103
+ Permission is hereby granted, free of charge, to any person obtaining a copy
87
104
  of this software and associated documentation files (the "Software"), to deal
88
105
  in the Software without restriction, including without limitation the rights
89
106
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
@@ -99,8 +116,9 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
99
116
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
100
117
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
101
118
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
102
- SOFTWARE.</pre>
103
- </section>
104
- </main>
105
- </body>
119
+ SOFTWARE.</pre
120
+ >
121
+ </section>
122
+ </main>
123
+ </body>
106
124
  </html>