Hub de apps
Mapa automatico dos apps publicados neste diretorio.
Total encontrado
61
Apps dinamicos
30
Apps estaticos
31
Apps disponiveis
61 de 61 visiveis
Imagem
Imagem
Ferramenta
Imagem
Ferramenta
Imagem
Imagem
Ferramenta
Ferramenta
Audio
Amazon
Amazon
Amazon
Amazon
Amazon
Audio
Amazon
Amazon
Amazon
Amazon
Amazon
Audio
Audio
Audio
Audio
Amazon
Amazon
Amazon
Amazon
Amazon
Amazon
Ferramenta
Ferramenta
Amazon
Imagem
Imagem
]*>(.*?)/is', $html, $match)) { $title = app_text($match[1]); if ($title !== '') { return $title; } } if (preg_match('/]*>(.*?)/is', $html, $match)) { $title = app_text($match[1]); if ($title !== '') { return $title; } } return basename(dirname($path)); } function app_slug_label($slug) { $label = str_replace(['-', '_'], ' ', $slug); $updated = preg_replace('/\bv(\d+)\b/i', 'v$1', $label); $label = $updated === null ? $label : $updated; $label = ucwords($label); $updated = preg_replace('/\bV(\d+)\b/', 'v$1', $label); return $updated === null ? $label : $updated; } function app_category($relativePath, $text) { $path = strtolower($relativePath); $haystack = strtolower($relativePath . ' ' . $text); if (str_contains($path, 'retouch')) { return 'Imagem'; } if (str_contains($path, 'oferta')) { return 'Amazon'; } if (str_contains($path, 'separador') || str_contains($path, 'voz') || str_contains($path, 'v5') || str_contains($path, 'v6')) { return 'Audio'; } if (str_contains($path, 'oferta') || str_contains($path, 'amazon') || str_contains($haystack, 'produto')) { return 'Amazon'; } if (str_contains($haystack, 'image') || str_contains($haystack, 'openai')) { return 'Imagem'; } return 'Ferramenta'; } function app_description($relativePath) { $path = strtolower($relativePath); if (str_contains($path, 'retouch')) { return 'MVP para retocar imagens com IA, senha do app e chave de API.'; } if (str_contains($path, 'v6-oferta')) { return 'Gerador de video com analise de voz e oferta da Amazon puxada por link.'; } if (str_contains($path, 'separador') || str_contains($path, 'voz')) { return 'Ferramenta para carregar audio, marcar trechos por voz e baixar um JSON de segmentos.'; } if (str_contains($path, 'v5') || str_contains($path, 'v6')) { return 'Laboratorio de video/audio para sincronizar falas, vozes e gravacao do resultado.'; } if (str_contains($path, 'caixa') || str_contains($path, 'copa')) { return 'Experiencia da Caixa Amazon da Copa com microfone, boca animada, QR e oferta ao vivo.'; } if (str_contains($path, 'oferta')) { return 'Tela para puxar dados de produto da Amazon e montar uma oferta visual.'; } return 'App local encontrado no diretorio publicado.'; } function app_status($path) { if (basename($path) === 'index.php') { return 'Dinamico'; } return 'Estatico'; } function app_find_index_files($root) { $apps = []; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($root, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST ); foreach ($iterator as $file) { if (!$file->isFile()) { continue; } $name = $file->getFilename(); if ($name !== 'index.php' && $name !== 'index.html') { continue; } $path = $file->getPathname(); if ($path === __FILE__) { continue; } $dir = dirname($path); $relativeDir = trim(str_replace($root, '', $dir), DIRECTORY_SEPARATOR); if ($relativeDir === '') { continue; } if (!isset($apps[$relativeDir]) || $name === 'index.php') { $apps[$relativeDir] = $path; } } ksort($apps, SORT_NATURAL | SORT_FLAG_CASE); return $apps; } $apps = []; foreach (app_find_index_files($root) as $relativeDir => $path) { $raw = @file_get_contents($path); $rawText = $raw === false ? '' : app_text($raw); $title = app_title_from_file($path); $slug = basename($relativeDir); $cleanTitle = $title === $slug ? app_slug_label($slug) : $title; $url = str_replace(DIRECTORY_SEPARATOR, '/', $relativeDir) . '/'; $modified = filemtime($path) ?: time(); $apps[] = [ 'title' => $cleanTitle, 'path' => $url, 'category' => app_category($relativeDir, $rawText), 'description' => app_description($relativeDir), 'status' => app_status($path), 'updated' => date('d/m/Y H:i', $modified), 'sortTime' => $modified, ]; } usort($apps, function ($a, $b) { if ($a['sortTime'] === $b['sortTime']) { return 0; } return $a['sortTime'] < $b['sortTime'] ? 1 : -1; }); $total = count($apps); $categories = []; $dynamicTotal = 0; foreach ($apps as $app) { $categories[] = $app['category']; if ($app['status'] === 'Dinamico') { $dynamicTotal += 1; } } $categories = array_values(array_unique($categories)); sort($categories, SORT_NATURAL | SORT_FLAG_CASE); $staticTotal = $total - $dynamicTotal; ?> Hub de apps :root { color-scheme: light; --ink: #172026; --muted: #5b6770; --line: #d7dde2; --paper: #f5f7f8; --surface: #ffffff; --accent: #0f766e; --accent-ink: #ffffff; --warm: #a16207; --blue: #1d4ed8; --shadow: 0 18px 48px rgba(23, 32, 38, 0.11); } * { box-sizing: border-box; } body { margin: 0; min-height: 100vh; background: var(--paper); color: var(--ink); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } a { color: inherit; } .shell { width: min(1180px, calc(100% - 32px)); margin: 0 auto; padding: 32px 0 48px; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 28px; } .brand { display: flex; align-items: center; gap: 12px; min-width: 0; } .brand-mark { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 8px; background: var(--ink); color: #fff; font-weight: 800; letter-spacing: 0; } .brand h1 { margin: 0; font-size: clamp(1.55rem, 2.4vw, 2.4rem); line-height: 1.05; letter-spacing: 0; } .brand p { margin: 5px 0 0; color: var(--muted); font-size: 0.96rem; } .actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: flex-end; } .button { display: inline-flex; align-items: center; justify-content: center; min-height: 40px; padding: 0 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--ink); text-decoration: none; font-weight: 700; font-size: 0.9rem; } .button.primary { border-color: var(--accent); background: var(--accent); color: var(--accent-ink); } .overview { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 18px; } .metric { min-height: 94px; padding: 18px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: 0 8px 24px rgba(23, 32, 38, 0.05); } .metric span { display: block; color: var(--muted); font-size: 0.78rem; font-weight: 800; letter-spacing: 0; text-transform: uppercase; } .metric strong { display: block; margin-top: 8px; font-size: 2rem; line-height: 1; } .toolbar { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: center; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: var(--shadow); margin-bottom: 18px; } .search { display: flex; align-items: center; gap: 10px; min-width: 0; border: 1px solid var(--line); border-radius: 8px; padding: 0 12px; background: #fbfcfc; } .search span { color: var(--muted); font-weight: 900; } .search input { width: 100%; min-height: 42px; border: 0; outline: 0; background: transparent; color: var(--ink); font: inherit; } .filters { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; } .filter { min-height: 40px; border: 1px solid var(--line); border-radius: 8px; background: #fbfcfc; color: var(--muted); padding: 0 12px; font: inherit; font-weight: 800; cursor: pointer; } .filter.is-active { border-color: var(--ink); background: var(--ink); color: #fff; } .section-head { display: flex; align-items: end; justify-content: space-between; gap: 12px; margin: 22px 0 12px; } .section-head h2 { margin: 0; font-size: 1.1rem; } .section-head p { margin: 0; color: var(--muted); font-size: 0.92rem; } .grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; } .app-card { display: flex; flex-direction: column; min-height: 260px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); overflow: hidden; } .app-card[hidden] { display: none; } .card-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 16px 16px 0; } .app-icon { display: grid; place-items: center; flex: 0 0 auto; width: 42px; height: 42px; border-radius: 8px; background: #e6f3f1; color: var(--accent); font-weight: 900; } .badge { min-height: 28px; display: inline-flex; align-items: center; border-radius: 999px; border: 1px solid var(--line); padding: 0 10px; color: var(--muted); font-size: 0.78rem; font-weight: 800; } .badge[data-category="Audio"] { color: var(--blue); background: #eef4ff; border-color: #cadbff; } .badge[data-category="Amazon"] { color: var(--warm); background: #fff7df; border-color: #f0d990; } .badge[data-category="Imagem"] { color: #7c3aed; background: #f4efff; border-color: #d8c7ff; } .card-body { display: flex; flex: 1; flex-direction: column; padding: 14px 16px 16px; } .app-card h3 { margin: 0; font-size: 1.12rem; line-height: 1.2; letter-spacing: 0; } .app-card p { margin: 10px 0 0; color: var(--muted); line-height: 1.5; font-size: 0.94rem; } .meta { display: grid; gap: 7px; margin: auto 0 14px; padding-top: 18px; color: var(--muted); font-size: 0.82rem; } .meta span { min-width: 0; overflow-wrap: anywhere; } .card-actions { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; } .open-link { min-height: 40px; display: inline-flex; align-items: center; justify-content: center; border-radius: 8px; background: var(--ink); color: #fff; text-decoration: none; font-weight: 800; } .path-link { min-height: 40px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--line); border-radius: 8px; padding: 0 10px; color: var(--muted); text-decoration: none; font-weight: 900; } .empty { display: none; padding: 28px; border: 1px dashed var(--line); border-radius: 8px; background: var(--surface); color: var(--muted); text-align: center; } .empty.is-visible { display: block; } @media (max-width: 920px) { .topbar, .toolbar, .section-head { grid-template-columns: 1fr; align-items: stretch; } .topbar, .section-head { display: grid; } .actions, .filters { justify-content: flex-start; } .overview, .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 620px) { .shell { width: min(100% - 24px, 1180px); padding-top: 20px; } .brand { align-items: flex-start; } .overview, .grid { grid-template-columns: 1fr; } .toolbar { padding: 10px; } .filter { flex: 1 1 auto; } } H Hub de apps
App local encontrado no diretorio publicado.
Imagem
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Imagem
Imagem
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Imagem
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Ferramenta
Nenhum app combina com esse filtro.