Compare commits
No commits in common. "917fef3f71cc0a6259d5ac574ab9ac0bb477dce5" and "a3351378f345f4e70f23f05f4773bc88e35d811d" have entirely different histories.
917fef3f71
...
a3351378f3
@ -36,21 +36,7 @@
|
|||||||
"Bash(lsof:*)",
|
"Bash(lsof:*)",
|
||||||
"Bash(dotnet run:*)",
|
"Bash(dotnet run:*)",
|
||||||
"Bash(dotnet user-secrets:*)",
|
"Bash(dotnet user-secrets:*)",
|
||||||
"Bash(xargs grep:*)",
|
"Bash(xargs grep:*)"
|
||||||
"mcp__stripe__list_products",
|
|
||||||
"mcp__stripe__list_prices",
|
|
||||||
"mcp__stripe__get_stripe_account_info",
|
|
||||||
"mcp__stripe__search_stripe_resources",
|
|
||||||
"Bash(docker exec:*)",
|
|
||||||
"mcp__stripe__list_subscriptions",
|
|
||||||
"mcp__stripe__create_product",
|
|
||||||
"mcp__stripe__create_price",
|
|
||||||
"Bash(git push:*)",
|
|
||||||
"mcp__stripe__stripe_api_execute",
|
|
||||||
"mcp__stripe__stripe_api_search",
|
|
||||||
"Bash(ctx csharp:*)",
|
|
||||||
"Bash(ctx auto:*)",
|
|
||||||
"Bash(git log:*)"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"enableAllProjectMcpServers": false
|
"enableAllProjectMcpServers": false
|
||||||
|
|||||||
@ -254,10 +254,7 @@ jobs:
|
|||||||
"CtaDescription": "Junte-se a milhares de profissionais que já têm sua presença digital organizada no BCards.",
|
"CtaDescription": "Junte-se a milhares de profissionais que já têm sua presença digital organizada no BCards.",
|
||||||
"CtaButtonText": "Criar Minha Página Grátis",
|
"CtaButtonText": "Criar Minha Página Grátis",
|
||||||
"MetaKeywords": "cartão digital, página de links, bio links, linktree brasil, página profissional, corretor, advogado, médico, consultor",
|
"MetaKeywords": "cartão digital, página de links, bio links, linktree brasil, página profissional, corretor, advogado, médico, consultor",
|
||||||
"FooterTagline": "Sua presença digital profissional, simplificada.",
|
"FooterTagline": "Sua presença digital profissional, simplificada."
|
||||||
"HeroGradient": "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
|
|
||||||
"PrimaryColor": "#667eea",
|
|
||||||
"PrimaryColorDark": "#5a6fd6"
|
|
||||||
},
|
},
|
||||||
"Support": {
|
"Support": {
|
||||||
"TelegramUrl": "https://t.me/jobmakerbr",
|
"TelegramUrl": "https://t.me/jobmakerbr",
|
||||||
@ -402,30 +399,7 @@ jobs:
|
|||||||
"CtaDescription": "Milhares de criadoras já centralizam seus links e aumentam suas conversões com o SpicyLinks.",
|
"CtaDescription": "Milhares de criadoras já centralizam seus links e aumentam suas conversões com o SpicyLinks.",
|
||||||
"CtaButtonText": "Criar Minha Bio",
|
"CtaButtonText": "Criar Minha Bio",
|
||||||
"MetaKeywords": "bio links criadora, creator bio, linktree conteudo adulto, links onlyfans, bio instagram criadora",
|
"MetaKeywords": "bio links criadora, creator bio, linktree conteudo adulto, links onlyfans, bio instagram criadora",
|
||||||
"FooterTagline": "Seu conteúdo, sua identidade.",
|
"FooterTagline": "Seu conteúdo, sua identidade."
|
||||||
"HeroGradient": "linear-gradient(135deg, #ff416c 0%, #c0392b 100%)",
|
|
||||||
"PrimaryColor": "#e63946",
|
|
||||||
"PrimaryColorDark": "#c1121f",
|
|
||||||
"DefaultCategories": [
|
|
||||||
{ "Icon": "📸", "Name": "Modelos", "Slug": "modelos", "Description": "Modelos e criadores de conteúdo visual", "SeoKeywords": [ "modelo", "fotografia", "conteúdo", "criadora" ] },
|
|
||||||
{ "Icon": "⭐", "Name": "Influencers", "Slug": "influencers","Description": "Influencers e personalidades digitais", "SeoKeywords": [ "influencer", "digital", "social media" ] },
|
|
||||||
{ "Icon": "💪", "Name": "Fitness", "Slug": "fitness", "Description": "Criadores de conteúdo fitness e lifestyle", "SeoKeywords": [ "fitness", "academia", "saúde", "corpo" ] },
|
|
||||||
{ "Icon": "🎨", "Name": "Arte", "Slug": "arte", "Description": "Artistas e criadores de conteúdo visual", "SeoKeywords": [ "arte", "ilustração", "design", "criativo" ] },
|
|
||||||
{ "Icon": "🎵", "Name": "Música", "Slug": "musica", "Description": "Músicos e cantores independentes", "SeoKeywords": [ "música", "cantor", "artista", "show" ] },
|
|
||||||
{ "Icon": "🎮", "Name": "Gaming", "Slug": "gaming", "Description": "Streamers e criadores de conteúdo gamer", "SeoKeywords": [ "gaming", "streamer", "games", "twitch" ] },
|
|
||||||
{ "Icon": "🦸", "Name": "Cosplay", "Slug": "cosplay", "Description": "Cosplayers e criadores de fantasia", "SeoKeywords": [ "cosplay", "anime", "fantasia", "cosplayer" ] },
|
|
||||||
{ "Icon": "💋", "Name": "Lifestyle", "Slug": "lifestyle", "Description": "Criadores de conteúdo lifestyle e entretenimento", "SeoKeywords": [ "lifestyle", "entretenimento", "diversão" ] }
|
|
||||||
],
|
|
||||||
"AllowedLinkTypes": [
|
|
||||||
{ "Icon": "fas fa-globe", "Label": "🌐 Site Geral", "Prefix": "https://", "Placeholder": "exemplo.com", "Instructions": "Digite o domínio e caminho", "Color": "bg-primary" },
|
|
||||||
{ "Icon": "fas fa-envelope", "Label": "✉️ Email", "Prefix": "mailto:", "Placeholder": "seuemail@exemplo.com", "Instructions": "Digite apenas o email", "Color": "bg-success" },
|
|
||||||
{ "Icon": "fas fa-phone", "Label": "📞 Telefone", "Prefix": "tel:", "Placeholder": "5511999999999", "Instructions": "Número com código do país", "Color": "bg-success" },
|
|
||||||
{ "Icon": "fab fa-instagram", "Label": "📸 Instagram", "Prefix": "https://instagram.com/","Placeholder": "seu.usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-danger" },
|
|
||||||
{ "Icon": "fab fa-twitter", "Label": "🐦 Twitter/X", "Prefix": "https://x.com/", "Placeholder": "seu_usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-dark" },
|
|
||||||
{ "Icon": "fab fa-tiktok", "Label": "🎵 TikTok", "Prefix": "https://tiktok.com/@", "Placeholder": "seu.usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-dark" },
|
|
||||||
{ "Icon": "fas fa-shopping-cart","Label": "🛒 Lista de Desejos","Prefix": "https://", "Placeholder": "wishlist.com/...", "Instructions": "Link para lista de desejos", "Color": "bg-warning" },
|
|
||||||
{ "Icon": "fas fa-heart", "Label": "❤️ Assinatura", "Prefix": "https://", "Placeholder": "plataforma.com/...", "Instructions": "Link para plataforma paga", "Color": "bg-danger" }
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"Support": {
|
"Support": {
|
||||||
"TelegramUrl": "https://t.me/jobmakerbr",
|
"TelegramUrl": "https://t.me/jobmakerbr",
|
||||||
@ -570,22 +544,7 @@ jobs:
|
|||||||
"CtaDescription": "Líderes de toda denominação já usam o LusLinks para alcançar mais pessoas com sua mensagem de fé.",
|
"CtaDescription": "Líderes de toda denominação já usam o LusLinks para alcançar mais pessoas com sua mensagem de fé.",
|
||||||
"CtaButtonText": "Criar Minha Bio de Fé",
|
"CtaButtonText": "Criar Minha Bio de Fé",
|
||||||
"MetaKeywords": "bio links pastor, página ministério, linktree cristão, links religiosos, página iglesia, bio pastor, links igreja",
|
"MetaKeywords": "bio links pastor, página ministério, linktree cristão, links religiosos, página iglesia, bio pastor, links igreja",
|
||||||
"FooterTagline": "Conectando fé e comunidade.",
|
"FooterTagline": "Conectando fé e comunidade."
|
||||||
"HeroGradient": "linear-gradient(135deg, #5b9bd5 0%, #1a5276 100%)",
|
|
||||||
"PrimaryColor": "#2471a3",
|
|
||||||
"PrimaryColorDark": "#1a5276",
|
|
||||||
"AllowedLinkTypes": [
|
|
||||||
{ "Icon": "fas fa-globe", "Label": "🌐 Site / Ministério", "Prefix": "https://", "Placeholder": "ministerio.com.br", "Instructions": "Digite o domínio do site", "Color": "bg-primary" },
|
|
||||||
{ "Icon": "fas fa-envelope", "Label": "✉️ Email", "Prefix": "mailto:", "Placeholder": "contato@ministerio.com", "Instructions": "Digite apenas o email", "Color": "bg-success" },
|
|
||||||
{ "Icon": "fas fa-phone", "Label": "📞 Telefone / WhatsApp", "Prefix": "tel:", "Placeholder": "5511999999999", "Instructions": "Número com código do país", "Color": "bg-success" },
|
|
||||||
{ "Icon": "fab fa-youtube", "Label": "📺 YouTube", "Prefix": "https://youtube.com/", "Placeholder": "@canal ou c/CANAL", "Instructions": "Digite o canal ou @usuário", "Color": "bg-danger" },
|
|
||||||
{ "Icon": "fab fa-instagram", "Label": "📸 Instagram", "Prefix": "https://instagram.com/", "Placeholder": "seu.usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-danger" },
|
|
||||||
{ "Icon": "fas fa-book", "Label": "📖 Estudo / Série", "Prefix": "https://", "Placeholder": "link-do-estudo.com", "Instructions": "Link para estudo bíblico ou série", "Color": "bg-info" },
|
|
||||||
{ "Icon": "fas fa-calendar", "Label": "📅 Agenda / Eventos", "Prefix": "https://", "Placeholder": "calendly.com/seunome", "Instructions": "Link para agenda ou evento", "Color": "bg-warning" },
|
|
||||||
{ "Icon": "fas fa-donate", "Label": "🙏 Dízimos / Ofertas", "Prefix": "https://", "Placeholder": "pix.com.br/ministerio", "Instructions": "Link para doações ou dízimos", "Color": "bg-success" },
|
|
||||||
{ "Icon": "fas fa-map-marker-alt","Label": "📍 Localização", "Prefix": "https://maps.google.com/?q=", "VisualPrefix": "📍 Maps:", "Placeholder": "Rua da Igreja, 123", "Instructions": "Endereço da igreja/ministério", "Color": "bg-warning" },
|
|
||||||
{ "Icon": "fas fa-download", "Label": "⬇️ Material / Apostila","Prefix": "https://", "Placeholder": "drive.google.com/...", "Instructions": "Link para download de material", "Color": "bg-secondary" }
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"Support": {
|
"Support": {
|
||||||
"TelegramUrl": "https://t.me/jobmakerbr",
|
"TelegramUrl": "https://t.me/jobmakerbr",
|
||||||
|
|||||||
44
CLAUDE.md
44
CLAUDE.md
@ -243,46 +243,4 @@ if (page.Status == PageStatus.Creating || page.Status == PageStatus.Rejected)
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
This architecture supports a production-ready SaaS application with complex business rules, payment integration, and content moderation workflows.
|
This architecture supports a production-ready SaaS application with complex business rules, payment integration, and content moderation workflows.
|
||||||
|
|
||||||
|
|
||||||
# Project instructions
|
|
||||||
|
|
||||||
## ctx — use before reading files
|
|
||||||
|
|
||||||
This project has `ctx` available in PATH. Use it to understand the codebase **before** reading files directly. It produces compact markdown summaries that cost far fewer tokens than raw file content.
|
|
||||||
|
|
||||||
### When to use
|
|
||||||
|
|
||||||
**Always use `ctx` first** when you need to:
|
|
||||||
- Understand project structure → `ctx csharp project` or `ctx react project`
|
|
||||||
- Understand a file's structure → `ctx csharp outline <file>` or `ctx react outline <file>`
|
|
||||||
- Check build errors → `ctx csharp errors` or `ctx react errors`
|
|
||||||
- Understand git state → `ctx git`
|
|
||||||
- Detect what stack this project uses → `ctx auto detect`
|
|
||||||
|
|
||||||
### Workflow
|
|
||||||
|
|
||||||
1. **Start of session:** run `ctx auto detect` to see what's here, then `ctx <stack> project` for an overview.
|
|
||||||
2. **Before reading a file:** run `ctx <stack> outline <file>` first. Only read the full file if the outline isn't enough (e.g., you need to see method body logic).
|
|
||||||
3. **After making changes:** run `ctx <stack> errors` instead of `dotnet build` or `tsc` — the output is pre-filtered to only relevant diagnostics.
|
|
||||||
4. **Before committing:** run `ctx git` for a compact diff summary.
|
|
||||||
|
|
||||||
### Available commands
|
|
||||||
|
|
||||||
```
|
|
||||||
ctx auto detect # detect stack(s) in current directory
|
|
||||||
ctx auto project # run project summary for all detected stacks
|
|
||||||
|
|
||||||
ctx csharp project # .NET solution overview (projects, refs, packages)
|
|
||||||
ctx csharp outline <file.cs> # file structure without method bodies
|
|
||||||
ctx csharp errors # filtered dotnet build output (errors + top warnings)
|
|
||||||
|
|
||||||
ctx git # branch, status, recent commits, diff summary
|
|
||||||
```
|
|
||||||
|
|
||||||
### Important
|
|
||||||
|
|
||||||
- `ctx` output is a **summary**, not the full picture. If you need implementation details (method bodies, exact logic, specific lines), read the file directly.
|
|
||||||
- Do not run `ctx` commands that don't match the project stack. Use `ctx auto detect` if unsure.
|
|
||||||
- `ctx csharp errors` assumes `dotnet restore` was already run. If you get restore errors, run `dotnet restore` first, then `ctx csharp errors`.
|
|
||||||
@ -69,35 +69,34 @@ if (isDevelopment)
|
|||||||
if (!string.IsNullOrEmpty(openSearchUrl))
|
if (!string.IsNullOrEmpty(openSearchUrl))
|
||||||
{
|
{
|
||||||
var indexFormat = "b-cards-dev-{0:yyyy-MM}";
|
var indexFormat = "b-cards-dev-{0:yyyy-MM}";
|
||||||
Console.WriteLine($"[OPENSEARCH DEV] Configurando sink → {openSearchUrl}");
|
|
||||||
|
|
||||||
// TODO: após confirmar que conecta, restaurar try/catch silencioso (opcional)
|
try
|
||||||
loggerConfig.WriteTo.Async(a => a.OpenSearch(new OpenSearchSinkOptions(new Uri(openSearchUrl))
|
|
||||||
{
|
{
|
||||||
IndexFormat = indexFormat,
|
loggerConfig.WriteTo.Async(a => a.OpenSearch(new OpenSearchSinkOptions(new Uri(openSearchUrl))
|
||||||
AutoRegisterTemplate = false,
|
|
||||||
ModifyConnectionSettings = conn => conn
|
|
||||||
.RequestTimeout(TimeSpan.FromSeconds(5))
|
|
||||||
.PingTimeout(TimeSpan.FromSeconds(3)),
|
|
||||||
MinimumLogEventLevel = LogEventLevel.Debug,
|
|
||||||
EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog,
|
|
||||||
RegisterTemplateFailure = RegisterTemplateRecovery.IndexAnyway,
|
|
||||||
BatchPostingLimit = 10,
|
|
||||||
Period = TimeSpan.FromSeconds(2),
|
|
||||||
TemplateCustomSettings = new Dictionary<string, string>
|
|
||||||
{
|
{
|
||||||
{"number_of_shards", "1"},
|
IndexFormat = indexFormat,
|
||||||
{"number_of_replicas", "0"}
|
AutoRegisterTemplate = false, // Não faz GET / no startup
|
||||||
}
|
ModifyConnectionSettings = conn => conn
|
||||||
}),
|
.RequestTimeout(TimeSpan.FromSeconds(5))
|
||||||
bufferSize: 10000,
|
.PingTimeout(TimeSpan.FromSeconds(3)),
|
||||||
blockWhenFull: false);
|
MinimumLogEventLevel = LogEventLevel.Debug,
|
||||||
|
EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog,
|
||||||
Console.WriteLine($"[OPENSEARCH DEV] Sink registrado. Erros de envio aparecem como [SERILOG SELF] no console.");
|
RegisterTemplateFailure = RegisterTemplateRecovery.IndexAnyway,
|
||||||
}
|
BatchPostingLimit = 10,
|
||||||
else
|
Period = TimeSpan.FromSeconds(2),
|
||||||
{
|
TemplateCustomSettings = new Dictionary<string, string>
|
||||||
Console.WriteLine("[OPENSEARCH DEV] OpenSearchUrl não configurado — sem sink OpenSearch.");
|
{
|
||||||
|
{"number_of_shards", "1"},
|
||||||
|
{"number_of_replicas", "0"}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
bufferSize: 10000,
|
||||||
|
blockWhenFull: false);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// Falha silenciosa - logs continuam no console e arquivo
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -152,10 +151,9 @@ else
|
|||||||
Period = TimeSpan.FromSeconds(5),
|
Period = TimeSpan.FromSeconds(5),
|
||||||
}), bufferSize: 10000, blockWhenFull: false);
|
}), bufferSize: 10000, blockWhenFull: false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
// OpenSearch é opcional — app continua com console/arquivo
|
// Falha silenciosa em produção - logs continuam no console/arquivo
|
||||||
Console.WriteLine($"[OPENSEARCH PROD] Falha ao configurar sink → {openSearchUrl}: {ex.Message}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,75 +7,29 @@
|
|||||||
Layout = "_Layout";
|
Layout = "_Layout";
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="container-fluid px-3 px-lg-5 py-5">
|
<div class="container py-5">
|
||||||
<div class="text-center mb-5">
|
<div class="text-center mb-5">
|
||||||
<h1 class="display-5 fw-bold mb-3">Escolha o plano ideal para você</h1>
|
<h1 class="display-5 fw-bold mb-3">Escolha o plano ideal para você</h1>
|
||||||
<p class="lead text-muted">Comece grátis e faça upgrade quando precisar de mais recursos</p>
|
<p class="lead text-muted">Comece grátis e faça upgrade quando precisar de mais recursos</p>
|
||||||
|
|
||||||
<!-- Toggle Mensal/Anual -->
|
<!-- Toggle Mensal/Anual -->
|
||||||
<div class="d-flex justify-content-center mb-4 mt-3">
|
<div class="d-flex justify-content-center mb-4">
|
||||||
<div class="pricing-toggle-wrapper">
|
<div class="btn-group" role="group" aria-label="Período de cobrança">
|
||||||
<span class="pricing-savings-chip">🎁 2 meses grátis</span>
|
<input type="radio" class="btn-check" name="billingPeriod" id="monthly" autocomplete="off" checked>
|
||||||
<div class="pricing-pill">
|
<label class="btn btn-outline-primary" for="monthly">Mensal</label>
|
||||||
<button type="button" class="pill-btn pill-active" id="btnMonthly">Mensal</button>
|
|
||||||
<button type="button" class="pill-btn" id="btnYearly">Anual</button>
|
<input type="radio" class="btn-check" name="billingPeriod" id="yearly" autocomplete="off">
|
||||||
</div>
|
<label class="btn btn-outline-primary" for="yearly">
|
||||||
|
Anual
|
||||||
|
<span class="badge bg-success ms-1">2 meses grátis</span>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<style>
|
|
||||||
.pricing-toggle-wrapper {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.pricing-savings-chip {
|
|
||||||
position: absolute;
|
|
||||||
top: -24px;
|
|
||||||
right: -4px;
|
|
||||||
background: #198754;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 0.68rem;
|
|
||||||
font-weight: 700;
|
|
||||||
padding: 2px 9px;
|
|
||||||
border-radius: 20px;
|
|
||||||
white-space: nowrap;
|
|
||||||
letter-spacing: 0.02em;
|
|
||||||
}
|
|
||||||
.pricing-pill {
|
|
||||||
display: inline-flex;
|
|
||||||
background: #ededf3;
|
|
||||||
border-radius: 50px;
|
|
||||||
padding: 4px;
|
|
||||||
gap: 2px;
|
|
||||||
}
|
|
||||||
.pill-btn {
|
|
||||||
padding: 8px 32px;
|
|
||||||
border-radius: 50px;
|
|
||||||
border: none;
|
|
||||||
background: transparent;
|
|
||||||
color: #555;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 0.95rem;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background 0.18s, color 0.18s, box-shadow 0.18s;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.pill-btn.pill-active {
|
|
||||||
background: var(--tenant-primary, #667eea);
|
|
||||||
color: #fff;
|
|
||||||
box-shadow: 0 2px 10px rgba(0,0,0,.18);
|
|
||||||
}
|
|
||||||
.pricing-cards .card-body {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
}
|
|
||||||
.pricing-cards .card-header h5 {
|
|
||||||
font-size: 0.95rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-4 row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-5 pricing-cards">
|
<div class="row g-3 justify-content-center pricing-cards">
|
||||||
<!-- Plano Trial -->
|
<!-- Plano Trial -->
|
||||||
<div class="col">
|
<div class="col-xl-2 col-lg-4 col-md-6">
|
||||||
<div class="card h-100 border-0 shadow-sm">
|
<div class="card h-100 border-0 shadow-sm">
|
||||||
<div class="card-header bg-success bg-opacity-10 text-center py-4">
|
<div class="card-header bg-success bg-opacity-10 text-center py-4">
|
||||||
<h5 class="mb-0">Trial Gratuito</h5>
|
<h5 class="mb-0">Trial Gratuito</h5>
|
||||||
@ -122,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Plano Básico -->
|
<!-- Plano Básico -->
|
||||||
<div class="col">
|
<div class="col-xl-2 col-lg-4 col-md-6">
|
||||||
<div class="card h-100 border-0 shadow-sm">
|
<div class="card h-100 border-0 shadow-sm">
|
||||||
<div class="card-header bg-light text-center py-4">
|
<div class="card-header bg-light text-center py-4">
|
||||||
<h5 class="mb-0">Básico</h5>
|
<h5 class="mb-0">Básico</h5>
|
||||||
@ -196,7 +150,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Plano Profissional (Decoy) -->
|
<!-- Plano Profissional (Decoy) -->
|
||||||
<div class="col">
|
<div class="col-xl-2 col-lg-4 col-md-6">
|
||||||
<div class="card h-100 border-0 shadow-sm">
|
<div class="card h-100 border-0 shadow-sm">
|
||||||
<div class="card-header bg-warning bg-opacity-10 text-center py-4">
|
<div class="card-header bg-warning bg-opacity-10 text-center py-4">
|
||||||
<h5 class="mb-0">Profissional</h5>
|
<h5 class="mb-0">Profissional</h5>
|
||||||
@ -270,10 +224,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Plano Premium (Mais Popular) -->
|
<!-- Plano Premium (Mais Popular) -->
|
||||||
<div class="col">
|
<div class="col-xl-2 col-lg-4 col-md-6">
|
||||||
<div class="card h-100 border-primary shadow">
|
<div class="card h-100 border-primary shadow position-relative">
|
||||||
<div class="card-header bg-primary text-white text-center pt-3 pb-4">
|
<div class="position-absolute top-0 start-50 translate-middle">
|
||||||
<span class="badge bg-white text-primary px-3 py-1 mb-2 d-inline-block" style="font-size:0.7rem;letter-spacing:.04em;">⭐ Mais Popular</span>
|
<span class="badge bg-primary px-3 py-2">Mais Popular</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-header bg-primary text-white text-center py-4">
|
||||||
<h5 class="mb-0">Premium</h5>
|
<h5 class="mb-0">Premium</h5>
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<div class="pricing-monthly">
|
<div class="pricing-monthly">
|
||||||
@ -353,10 +309,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Plano Premium + Afiliados -->
|
<!-- Plano Premium + Afiliados -->
|
||||||
<div class="col">
|
<div class="col-xl-2 col-lg-4 col-md-6">
|
||||||
<div class="card h-100 border-success shadow">
|
<div class="card h-100 border-success shadow">
|
||||||
<div class="card-header bg-success text-white text-center pt-3 pb-4">
|
<div class="position-absolute top-0 start-50 translate-middle pricing-premium-badge">
|
||||||
<span class="badge bg-white text-success px-3 py-1 mb-2 d-inline-block" style="font-size:0.7rem;letter-spacing:.04em;">🆕 Novo!</span>
|
<span class="badge bg-success px-3 py-2">Novo!</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-header bg-success text-white text-center py-4">
|
||||||
<h5 class="mb-0">Premium + Afiliados</h5>
|
<h5 class="mb-0">Premium + Afiliados</h5>
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<div class="pricing-monthly">
|
<div class="pricing-monthly">
|
||||||
@ -436,7 +394,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<!-- Comparação de recursos -->
|
<!-- Comparação de recursos -->
|
||||||
<div class="mt-5 pt-5">
|
<div class="mt-5 pt-5">
|
||||||
<h2 class="text-center mb-4">Compare todos os recursos</h2>
|
<h2 class="text-center mb-4">Compare todos os recursos</h2>
|
||||||
@ -578,7 +535,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div><!-- /container inner -->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if (TempData["Success"] != null)
|
@if (TempData["Success"] != null)
|
||||||
@ -631,20 +587,22 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
const btnMonthly = document.getElementById('btnMonthly');
|
const monthlyRadio = document.getElementById('monthly');
|
||||||
const btnYearly = document.getElementById('btnYearly');
|
const yearlyRadio = document.getElementById('yearly');
|
||||||
const monthlyElements = document.querySelectorAll('.pricing-monthly');
|
const monthlyElements = document.querySelectorAll('.pricing-monthly');
|
||||||
const yearlyElements = document.querySelectorAll('.pricing-yearly');
|
const yearlyElements = document.querySelectorAll('.pricing-yearly');
|
||||||
|
|
||||||
function setPricing(period) {
|
function togglePricing() {
|
||||||
const isYearly = period === 'yearly';
|
if (yearlyRadio.checked) {
|
||||||
btnMonthly.classList.toggle('pill-active', !isYearly);
|
monthlyElements.forEach(el => el.classList.add('d-none'));
|
||||||
btnYearly.classList.toggle('pill-active', isYearly);
|
yearlyElements.forEach(el => el.classList.remove('d-none'));
|
||||||
monthlyElements.forEach(el => el.classList.toggle('d-none', isYearly));
|
} else {
|
||||||
yearlyElements.forEach(el => el.classList.toggle('d-none', !isYearly));
|
monthlyElements.forEach(el => el.classList.remove('d-none'));
|
||||||
|
yearlyElements.forEach(el => el.classList.add('d-none'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
btnMonthly.addEventListener('click', () => setPricing('monthly'));
|
monthlyRadio.addEventListener('change', togglePricing);
|
||||||
btnYearly.addEventListener('click', () => setPricing('yearly'));
|
yearlyRadio.addEventListener('change', togglePricing);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -51,6 +51,8 @@
|
|||||||
--tenant-gradient: @tenant.HeroGradient;
|
--tenant-gradient: @tenant.HeroGradient;
|
||||||
}
|
}
|
||||||
.hero-section { background: var(--tenant-gradient) !important; }
|
.hero-section { background: var(--tenant-gradient) !important; }
|
||||||
|
.bg-home-blue { background: var(--tenant-gradient) !important; }
|
||||||
|
.bg-home-blue .navbar-collapse { background-color: color-mix(in srgb, var(--tenant-primary) 80%, black) !important; }
|
||||||
.btn-primary { background-color: var(--tenant-primary) !important; border-color: var(--tenant-primary) !important; }
|
.btn-primary { background-color: var(--tenant-primary) !important; border-color: var(--tenant-primary) !important; }
|
||||||
.btn-primary:hover { background-color: var(--tenant-primary-dark) !important; border-color: var(--tenant-primary-dark) !important; }
|
.btn-primary:hover { background-color: var(--tenant-primary-dark) !important; border-color: var(--tenant-primary-dark) !important; }
|
||||||
.btn-outline-primary { color: var(--tenant-primary) !important; border-color: var(--tenant-primary) !important; }
|
.btn-outline-primary { color: var(--tenant-primary) !important; border-color: var(--tenant-primary) !important; }
|
||||||
@ -99,14 +101,14 @@
|
|||||||
100% { background-position: 200% 0; }
|
100% { background-position: 200% 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Destacar item ativo do menu — usa cor do tenant */
|
/* Destacar item ativo do menu */
|
||||||
.nav-link.active {
|
.nav-link.active {
|
||||||
background-color: color-mix(in srgb, var(--tenant-primary, #0d6efd) 10%, transparent) !important;
|
background-color: rgba(0, 123, 255, 0.1) !important;
|
||||||
border-radius: 6px !important;
|
border-radius: 6px !important;
|
||||||
font-weight: 600 !important;
|
font-weight: 600 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Para homepage (fundo colorido) */
|
/* Para homepage (fundo azul) */
|
||||||
.bg-home-blue .nav-link.active {
|
.bg-home-blue .nav-link.active {
|
||||||
background-color: rgba(255, 255, 255, 0.2) !important;
|
background-color: rgba(255, 255, 255, 0.2) !important;
|
||||||
}
|
}
|
||||||
@ -157,8 +159,7 @@
|
|||||||
<div id="loading-bar"></div>
|
<div id="loading-bar"></div>
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<nav class="navbar navbar-expand-lg navbar-toggleable-sm navbar-light fixed-top @(ViewBag.IsHomePage == true ? "bg-home-blue" : "bg-dashboard")" id="mainNavbar"
|
<nav class="navbar navbar-expand-lg navbar-toggleable-sm navbar-light fixed-top @(ViewBag.IsHomePage == true ? "bg-home-blue" : "bg-dashboard")" id="mainNavbar">
|
||||||
style="@(ViewBag.IsHomePage == true ? $"background-color: {tenant.PrimaryColor} !important;" : "")">
|
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<a class="navbar-brand fw-bold @(ViewBag.IsHomePage == true ? "text-white" : "text-primary")"
|
<a class="navbar-brand fw-bold @(ViewBag.IsHomePage == true ? "text-white" : "text-primary")"
|
||||||
asp-area="" asp-controller="Home" asp-action="Index">
|
asp-area="" asp-controller="Home" asp-action="Index">
|
||||||
|
|||||||
@ -1,25 +1,25 @@
|
|||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Debug",
|
"Default": "Debug",
|
||||||
"System": "Information",
|
"System": "Information",
|
||||||
"Microsoft": "Information",
|
"Microsoft": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Stripe": {
|
"Stripe": {
|
||||||
"PublishableKey": "pk_test_51RjUmIBMIadsOxJVP4bWc54pHEOSf5km1hpOkOBSoGVoKxI46N4KSWtevpXCSq68OjFazBuXmPJGBwZ1KDN5MNJy003lj1YmAS",
|
"PublishableKey": "pk_test_51RjUmIBMIadsOxJVP4bWc54pHEOSf5km1hpOkOBSoGVoKxI46N4KSWtevpXCSq68OjFazBuXmPJGBwZ1KDN5MNJy003lj1YmAS",
|
||||||
"SecretKey": "sk_test_51RjUmIBMIadsOxJVeqsMFxnZ8ePR7d8IbnaF4sAwBVJv9rrfODPEQ2C9fF3beoABpITdfzEk0ZDzGTTQfvKv63xI00PeZoABGO",
|
"SecretKey": "sk_test_51RjUmIBMIadsOxJVeqsMFxnZ8ePR7d8IbnaF4sAwBVJv9rrfODPEQ2C9fF3beoABpITdfzEk0ZDzGTTQfvKv63xI00PeZoABGO",
|
||||||
"WebhookSecret": "whsec_8d189c137ff170ab5e62498003512b9d073e2db50c50ed7d8712b7ef11a37543",
|
"WebhookSecret": "whsec_8d189c137ff170ab5e62498003512b9d073e2db50c50ed7d8712b7ef11a37543",
|
||||||
"Environment": "test"
|
"Environment": "test"
|
||||||
},
|
},
|
||||||
"Serilog": {
|
"Serilog": {
|
||||||
"OpenSearchUrl": "http://192.168.0.100:9200"
|
"OpenSearchUrl": "http://192.168.0.100:9200",
|
||||||
},
|
},
|
||||||
"DetailedErrors": true,
|
"DetailedErrors": true,
|
||||||
"MongoDb": {
|
"MongoDb": {
|
||||||
"ConnectionString": "mongodb://localhost:27017",
|
"ConnectionString": "mongodb://localhost:27017",
|
||||||
"DatabaseName": "BCardsDB_Dev"
|
"DatabaseName": "BCardsDB_Dev"
|
||||||
},
|
},
|
||||||
"BaseUrl": "https://localhost:49178"
|
"BaseUrl": "https://localhost:49178"
|
||||||
}
|
}
|
||||||
@ -6,11 +6,7 @@
|
|||||||
"WebhookSecret": "whsec_8d189c137ff170ab5e62498003512b9d073e2db50c50ed7d8712b7ef11a37543",
|
"WebhookSecret": "whsec_8d189c137ff170ab5e62498003512b9d073e2db50c50ed7d8712b7ef11a37543",
|
||||||
"Environment": "test"
|
"Environment": "test"
|
||||||
},
|
},
|
||||||
"Serilog": {
|
|
||||||
"OpenSearchUrl": "http://192.168.0.100:9200"
|
|
||||||
},
|
|
||||||
"MongoDb": {
|
"MongoDb": {
|
||||||
"ConnectionString": "mongodb://localhost:27017",
|
|
||||||
"DatabaseName": "LusLinksDB"
|
"DatabaseName": "LusLinksDB"
|
||||||
},
|
},
|
||||||
"Tenant": {
|
"Tenant": {
|
||||||
@ -36,9 +32,6 @@
|
|||||||
"CtaButtonText": "Criar Minha Bio de Fé",
|
"CtaButtonText": "Criar Minha Bio de Fé",
|
||||||
"MetaKeywords": "bio links pastor, página ministério, linktree cristão, links religiosos, página iglesia, bio pastor, links igreja",
|
"MetaKeywords": "bio links pastor, página ministério, linktree cristão, links religiosos, página iglesia, bio pastor, links igreja",
|
||||||
"FooterTagline": "Conectando fé e comunidade.",
|
"FooterTagline": "Conectando fé e comunidade.",
|
||||||
"HeroGradient": "linear-gradient(135deg, #5b9bd5 0%, #1a5276 100%)",
|
|
||||||
"PrimaryColor": "#2471a3",
|
|
||||||
"PrimaryColorDark": "#1a5276",
|
|
||||||
"AllowedLinkTypes": [
|
"AllowedLinkTypes": [
|
||||||
{ "Icon": "fas fa-globe", "Label": "🌐 Site / Ministério", "Prefix": "https://", "Placeholder": "ministerio.com.br", "Instructions": "Digite o domínio do site", "Color": "bg-primary" },
|
{ "Icon": "fas fa-globe", "Label": "🌐 Site / Ministério", "Prefix": "https://", "Placeholder": "ministerio.com.br", "Instructions": "Digite o domínio do site", "Color": "bg-primary" },
|
||||||
{ "Icon": "fas fa-envelope", "Label": "✉️ Email", "Prefix": "mailto:", "Placeholder": "contato@ministerio.com", "Instructions": "Digite apenas o email", "Color": "bg-success" },
|
{ "Icon": "fas fa-envelope", "Label": "✉️ Email", "Prefix": "mailto:", "Placeholder": "contato@ministerio.com", "Instructions": "Digite apenas o email", "Color": "bg-success" },
|
||||||
|
|||||||
@ -7,13 +7,8 @@
|
|||||||
"Environment": "test"
|
"Environment": "test"
|
||||||
},
|
},
|
||||||
"MongoDb": {
|
"MongoDb": {
|
||||||
"ConnectionString": "mongodb://localhost:27017",
|
|
||||||
"DatabaseName": "SpicyLinksDB"
|
"DatabaseName": "SpicyLinksDB"
|
||||||
},
|
},
|
||||||
"Serilog": {
|
|
||||||
"OpenSearchUrl": "http://192.168.0.100:9200"
|
|
||||||
},
|
|
||||||
|
|
||||||
"Tenant": {
|
"Tenant": {
|
||||||
"SiteName": "SpicyLinks",
|
"SiteName": "SpicyLinks",
|
||||||
"SiteDescription": "A plataforma discreta e segura para criadores de conteúdo adulto. Reúna suas assinaturas, lista de desejos, redes sociais e conteúdo exclusivo em uma única bio.",
|
"SiteDescription": "A plataforma discreta e segura para criadores de conteúdo adulto. Reúna suas assinaturas, lista de desejos, redes sociais e conteúdo exclusivo em uma única bio.",
|
||||||
@ -28,21 +23,9 @@
|
|||||||
"HeroCtaText": "Criar Minha Bio",
|
"HeroCtaText": "Criar Minha Bio",
|
||||||
"FeaturesHeadline": "Por que criadores escolhem o {SiteName}?",
|
"FeaturesHeadline": "Por que criadores escolhem o {SiteName}?",
|
||||||
"Features": [
|
"Features": [
|
||||||
{
|
{ "Icon": "❤️", "Title": "Tudo num Só Link", "Description": "Instagram, Twitter/X, OnlyFans, lista de desejos e mais — tudo em uma bio única, elegante e fácil de compartilhar." },
|
||||||
"Icon": "❤️",
|
{ "Icon": "🔒", "Title": "Verificação de Idade", "Description": "Acesso protegido com verificação de idade automática. Plataforma segura, discreta e responsável." },
|
||||||
"Title": "Tudo num Só Link",
|
{ "Icon": "📊", "Title": "Saiba Quem Te Visita", "Description": "Analytics detalhado de cliques, visualizações e origem do tráfego para otimizar suas conversões." }
|
||||||
"Description": "Instagram, Twitter/X, OnlyFans, lista de desejos e mais — tudo em uma bio única, elegante e fácil de compartilhar."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "🔒",
|
|
||||||
"Title": "Verificação de Idade",
|
|
||||||
"Description": "Acesso protegido com verificação de idade automática. Plataforma segura, discreta e responsável."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "📊",
|
|
||||||
"Title": "Saiba Quem Te Visita",
|
|
||||||
"Description": "Analytics detalhado de cliques, visualizações e origem do tráfego para otimizar suas conversões."
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"CtaHeadline": "Pronta para monetizar seu conteúdo?",
|
"CtaHeadline": "Pronta para monetizar seu conteúdo?",
|
||||||
"CtaDescription": "Milhares de criadoras já centralizam seus links e aumentam suas conversões com o SpicyLinks.",
|
"CtaDescription": "Milhares de criadoras já centralizam seus links e aumentam suas conversões com o SpicyLinks.",
|
||||||
@ -53,128 +36,24 @@
|
|||||||
"PrimaryColor": "#e63946",
|
"PrimaryColor": "#e63946",
|
||||||
"PrimaryColorDark": "#c1121f",
|
"PrimaryColorDark": "#c1121f",
|
||||||
"DefaultCategories": [
|
"DefaultCategories": [
|
||||||
{
|
{ "Icon": "📸", "Name": "Modelos", "Slug": "modelos", "Description": "Modelos e criadores de conteúdo visual", "SeoKeywords": ["modelo", "fotografia", "conteúdo", "criadora"] },
|
||||||
"Icon": "📸",
|
{ "Icon": "⭐", "Name": "Influencers", "Slug": "influencers", "Description": "Influencers e personalidades digitais", "SeoKeywords": ["influencer", "digital", "social media"] },
|
||||||
"Name": "Modelos",
|
{ "Icon": "💪", "Name": "Fitness", "Slug": "fitness", "Description": "Criadores de conteúdo fitness e lifestyle", "SeoKeywords": ["fitness", "academia", "saúde", "corpo"] },
|
||||||
"Slug": "modelos",
|
{ "Icon": "🎨", "Name": "Arte", "Slug": "arte", "Description": "Artistas e criadores de conteúdo visual", "SeoKeywords": ["arte", "ilustração", "design", "criativo"] },
|
||||||
"Description": "Modelos e criadores de conteúdo visual",
|
{ "Icon": "🎵", "Name": "Música", "Slug": "musica", "Description": "Músicos e cantores independentes", "SeoKeywords": ["música", "cantor", "artista", "show"] },
|
||||||
"SeoKeywords": [ "modelo", "fotografia", "conteúdo", "criadora" ]
|
{ "Icon": "🎮", "Name": "Gaming", "Slug": "gaming", "Description": "Streamers e criadores de conteúdo gamer", "SeoKeywords": ["gaming", "streamer", "games", "twitch"] },
|
||||||
},
|
{ "Icon": "🦸", "Name": "Cosplay", "Slug": "cosplay", "Description": "Cosplayers e criadores de fantasia", "SeoKeywords": ["cosplay", "anime", "fantasia", "cosplayer"] },
|
||||||
{
|
{ "Icon": "💋", "Name": "Lifestyle", "Slug": "lifestyle", "Description": "Criadores de conteúdo lifestyle e entretenimento", "SeoKeywords": ["lifestyle", "entretenimento", "diversão"] }
|
||||||
"Icon": "⭐",
|
|
||||||
"Name": "Influencers",
|
|
||||||
"Slug": "influencers",
|
|
||||||
"Description": "Influencers e personalidades digitais",
|
|
||||||
"SeoKeywords": [ "influencer", "digital", "social media" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "💪",
|
|
||||||
"Name": "Fitness",
|
|
||||||
"Slug": "fitness",
|
|
||||||
"Description": "Criadores de conteúdo fitness e lifestyle",
|
|
||||||
"SeoKeywords": [ "fitness", "academia", "saúde", "corpo" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "🎨",
|
|
||||||
"Name": "Arte",
|
|
||||||
"Slug": "arte",
|
|
||||||
"Description": "Artistas e criadores de conteúdo visual",
|
|
||||||
"SeoKeywords": [ "arte", "ilustração", "design", "criativo" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "🎵",
|
|
||||||
"Name": "Música",
|
|
||||||
"Slug": "musica",
|
|
||||||
"Description": "Músicos e cantores independentes",
|
|
||||||
"SeoKeywords": [ "música", "cantor", "artista", "show" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "🎮",
|
|
||||||
"Name": "Gaming",
|
|
||||||
"Slug": "gaming",
|
|
||||||
"Description": "Streamers e criadores de conteúdo gamer",
|
|
||||||
"SeoKeywords": [ "gaming", "streamer", "games", "twitch" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "🦸",
|
|
||||||
"Name": "Cosplay",
|
|
||||||
"Slug": "cosplay",
|
|
||||||
"Description": "Cosplayers e criadores de fantasia",
|
|
||||||
"SeoKeywords": [ "cosplay", "anime", "fantasia", "cosplayer" ]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "💋",
|
|
||||||
"Name": "Lifestyle",
|
|
||||||
"Slug": "lifestyle",
|
|
||||||
"Description": "Criadores de conteúdo lifestyle e entretenimento",
|
|
||||||
"SeoKeywords": [ "lifestyle", "entretenimento", "diversão" ]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"AllowedLinkTypes": [
|
"AllowedLinkTypes": [
|
||||||
{
|
{ "Icon": "fas fa-globe", "Label": "🌐 Site Geral", "Prefix": "https://", "Placeholder": "exemplo.com", "Instructions": "Digite o domínio e caminho", "Color": "bg-primary" },
|
||||||
"Icon": "fas fa-globe",
|
{ "Icon": "fas fa-envelope", "Label": "✉️ Email", "Prefix": "mailto:", "Placeholder": "seuemail@exemplo.com", "Instructions": "Digite apenas o email", "Color": "bg-success" },
|
||||||
"Label": "🌐 Site Geral",
|
{ "Icon": "fas fa-phone", "Label": "📞 Telefone", "Prefix": "tel:", "Placeholder": "5511999999999", "Instructions": "Número com código do país", "Color": "bg-success" },
|
||||||
"Prefix": "https://",
|
{ "Icon": "fab fa-instagram", "Label": "📸 Instagram", "Prefix": "https://instagram.com/","Placeholder": "seu.usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-danger" },
|
||||||
"Placeholder": "exemplo.com",
|
{ "Icon": "fab fa-twitter", "Label": "🐦 Twitter/X", "Prefix": "https://x.com/", "Placeholder": "seu_usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-dark" },
|
||||||
"Instructions": "Digite o domínio e caminho",
|
{ "Icon": "fab fa-tiktok", "Label": "🎵 TikTok", "Prefix": "https://tiktok.com/@", "Placeholder": "seu.usuario", "Instructions": "Digite apenas seu usuário", "Color": "bg-dark" },
|
||||||
"Color": "bg-primary"
|
{ "Icon": "fas fa-shopping-cart","Label": "🛒 Lista de Desejos","Prefix": "https://", "Placeholder": "wishlist.com/...", "Instructions": "Link para lista de desejos", "Color": "bg-warning" },
|
||||||
},
|
{ "Icon": "fas fa-heart", "Label": "❤️ Assinatura", "Prefix": "https://", "Placeholder": "plataforma.com/...", "Instructions": "Link para plataforma paga", "Color": "bg-danger" }
|
||||||
{
|
|
||||||
"Icon": "fas fa-envelope",
|
|
||||||
"Label": "✉️ Email",
|
|
||||||
"Prefix": "mailto:",
|
|
||||||
"Placeholder": "seuemail@exemplo.com",
|
|
||||||
"Instructions": "Digite apenas o email",
|
|
||||||
"Color": "bg-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "fas fa-phone",
|
|
||||||
"Label": "📞 Telefone",
|
|
||||||
"Prefix": "tel:",
|
|
||||||
"Placeholder": "5511999999999",
|
|
||||||
"Instructions": "Número com código do país",
|
|
||||||
"Color": "bg-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "fab fa-instagram",
|
|
||||||
"Label": "📸 Instagram",
|
|
||||||
"Prefix": "https://instagram.com/",
|
|
||||||
"Placeholder": "seu.usuario",
|
|
||||||
"Instructions": "Digite apenas seu usuário",
|
|
||||||
"Color": "bg-danger"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "fab fa-twitter",
|
|
||||||
"Label": "🐦 Twitter/X",
|
|
||||||
"Prefix": "https://x.com/",
|
|
||||||
"Placeholder": "seu_usuario",
|
|
||||||
"Instructions": "Digite apenas seu usuário",
|
|
||||||
"Color": "bg-dark"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "fab fa-tiktok",
|
|
||||||
"Label": "🎵 TikTok",
|
|
||||||
"Prefix": "https://tiktok.com/@",
|
|
||||||
"Placeholder": "seu.usuario",
|
|
||||||
"Instructions": "Digite apenas seu usuário",
|
|
||||||
"Color": "bg-dark"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "fas fa-shopping-cart",
|
|
||||||
"Label": "🛒 Lista de Desejos",
|
|
||||||
"Prefix": "https://",
|
|
||||||
"Placeholder": "wishlist.com/...",
|
|
||||||
"Instructions": "Link para lista de desejos",
|
|
||||||
"Color": "bg-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Icon": "fas fa-heart",
|
|
||||||
"Label": "❤️ Assinatura",
|
|
||||||
"Prefix": "https://",
|
|
||||||
"Placeholder": "plataforma.com/...",
|
|
||||||
"Instructions": "Link para plataforma paga",
|
|
||||||
"Color": "bg-danger"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"SendGrid": {
|
"SendGrid": {
|
||||||
|
|||||||
@ -193,9 +193,6 @@
|
|||||||
"CtaButtonText": "Criar Minha Página Grátis",
|
"CtaButtonText": "Criar Minha Página Grátis",
|
||||||
"MetaKeywords": "cartão digital, página de links, bio links, linktree brasil, página profissional, corretor, advogado, médico, consultor",
|
"MetaKeywords": "cartão digital, página de links, bio links, linktree brasil, página profissional, corretor, advogado, médico, consultor",
|
||||||
"FooterTagline": "Sua presença digital profissional, simplificada.",
|
"FooterTagline": "Sua presença digital profissional, simplificada.",
|
||||||
"HeroGradient": "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
|
|
||||||
"PrimaryColor": "#667eea",
|
|
||||||
"PrimaryColorDark": "#5a6fd6",
|
|
||||||
"AllowedLinkTypes": [
|
"AllowedLinkTypes": [
|
||||||
{ "Icon": "fas fa-globe", "Label": "🌐 Site Geral", "Prefix": "https://", "Placeholder": "exemplo.com", "Instructions": "Digite apenas o domínio e caminho (sem https://)", "Color": "bg-primary" },
|
{ "Icon": "fas fa-globe", "Label": "🌐 Site Geral", "Prefix": "https://", "Placeholder": "exemplo.com", "Instructions": "Digite apenas o domínio e caminho (sem https://)", "Color": "bg-primary" },
|
||||||
{ "Icon": "fas fa-shopping-cart", "Label": "🛒 Loja/E-commerce", "Prefix": "https://", "Placeholder": "minhaloja.com/produto", "Instructions": "Digite apenas o domínio e caminho da sua loja", "Color": "bg-success" },
|
{ "Icon": "fas fa-shopping-cart", "Label": "🛒 Loja/E-commerce", "Prefix": "https://", "Placeholder": "minhaloja.com/produto", "Instructions": "Digite apenas o domínio e caminho da sua loja", "Color": "bg-success" },
|
||||||
|
|||||||
@ -143,9 +143,9 @@ body > .container-fluid {
|
|||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Menu Home — cor sólida primária do tenant (gradiente em elemento estreito parece diferente do hero) */
|
/* Menu Home (gradiente) */
|
||||||
.bg-home-blue {
|
.bg-home-blue {
|
||||||
background-color: var(--tenant-primary, #667eea) !important;
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bg-home-blue .navbar-brand,
|
.bg-home-blue .navbar-brand,
|
||||||
@ -185,6 +185,6 @@ body > .container-fluid {
|
|||||||
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
|
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
.bg-home-blue .navbar-collapse {
|
.bg-home-blue .navbar-collapse {
|
||||||
background-color: color-mix(in srgb, var(--tenant-primary, #764ba2) 85%, black);
|
background-color: rgba(118, 75, 162, 0.95); /* Cor do gradiente para o menu recolhido */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user