feat: Modalidades — novos campos de preview (tag, subtitle, comparação)

This commit is contained in:
2026-08-12 08:55:20 -03:00
parent 1425d7aaa1
commit 3f55180b73
5 changed files with 78 additions and 16 deletions

View File

@@ -24,6 +24,12 @@ class WeddingPackageForm
->label('Número / tipo (ex.: 01 / COMPLETA)') ->label('Número / tipo (ex.: 01 / COMPLETA)')
->required() ->required()
->maxLength(255), ->maxLength(255),
TextInput::make('tag')
->label('Etiqueta curta (ex.: Assessoria completa)')
->maxLength(255),
TextInput::make('subtitle')
->label('Frase de apoio')
->maxLength(255),
Textarea::make('summary') Textarea::make('summary')
->label('Resumo') ->label('Resumo')
->required() ->required()
@@ -44,6 +50,12 @@ class WeddingPackageForm
->label('Texto do botão') ->label('Texto do botão')
->required() ->required()
->maxLength(255), ->maxLength(255),
TextInput::make('compare_heading')
->label('Comparação — título (leitura rápida)')
->maxLength(255),
TextInput::make('compare_summary')
->label('Comparação — resumo (leitura rápida)')
->maxLength(255),
TextInput::make('sort_order') TextInput::make('sort_order')
->label('Ordem') ->label('Ordem')
->numeric() ->numeric()

View File

@@ -16,13 +16,17 @@ use Illuminate\Support\Carbon;
/** /**
* @property string $name * @property string $name
* @property string $level * @property string $level
* @property string|null $tag
* @property string|null $subtitle
* @property string $summary * @property string $summary
* @property list<string> $scope_items * @property list<string> $scope_items
* @property string $cta_label * @property string $cta_label
* @property string|null $compare_heading
* @property string|null $compare_summary
* @property int $sort_order * @property int $sort_order
* @property Carbon|null $published_at * @property Carbon|null $published_at
*/ */
#[Fillable(['name', 'level', 'summary', 'scope_items', 'cta_label', 'sort_order', 'published_at'])] #[Fillable(['name', 'level', 'tag', 'subtitle', 'summary', 'scope_items', 'cta_label', 'compare_heading', 'compare_summary', 'sort_order', 'published_at'])]
#[UsePolicy(WeddingPackagePolicy::class)] #[UsePolicy(WeddingPackagePolicy::class)]
class WeddingPackage extends Model class WeddingPackage extends Model
{ {

View File

@@ -18,9 +18,13 @@ class WeddingPackageFactory extends Factory
return [ return [
'name' => fake()->unique()->words(2, true), 'name' => fake()->unique()->words(2, true),
'level' => 'Assessoria', 'level' => 'Assessoria',
'tag' => fake()->words(2, true),
'subtitle' => fake()->sentence(),
'summary' => fake()->sentence(), 'summary' => fake()->sentence(),
'scope_items' => [fake()->sentence()], 'scope_items' => [fake()->sentence()],
'cta_label' => 'Conversar sobre esta modalidade', 'cta_label' => 'Conversar sobre esta modalidade',
'compare_heading' => fake()->words(3, true),
'compare_summary' => fake()->sentence(),
'sort_order' => 0, 'sort_order' => 0,
'published_at' => null, 'published_at' => null,
]; ];

View File

@@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('wedding_packages', function (Blueprint $table): void {
$table->string('tag')->nullable();
$table->string('subtitle')->nullable();
$table->string('compare_heading')->nullable();
$table->string('compare_summary')->nullable();
});
}
public function down(): void
{
Schema::table('wedding_packages', function (Blueprint $table): void {
$table->dropColumn(['tag', 'subtitle', 'compare_heading', 'compare_summary']);
});
}
};

View File

@@ -9,9 +9,9 @@ use Illuminate\Database\Seeder;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
/** /**
* Wedding package modalities shown on the home page (03 Amare Casamentos). * Wedding package modalities shown on the home page (03 Amare Casamentos)
* Copy is approved from the structural model preview (preview(1).html) and * and the services page. Copy is approved from the structural model preview
* remains editable via the Filament resource. * (preview(2).html) and remains editable via the Filament resource.
*/ */
class WeddingPackagesSeeder extends Seeder class WeddingPackagesSeeder extends Seeder
{ {
@@ -23,40 +23,55 @@ class WeddingPackagesSeeder extends Seeder
[ [
'name' => 'Essenza', 'name' => 'Essenza',
'level' => '01 / COMPLETA', 'level' => '01 / COMPLETA',
'summary' => 'Para casais que desejam contar com a Amare desde o planejamento até a realização do casamento.', 'tag' => 'Assessoria completa',
'subtitle' => 'Do planejamento ao grande dia.',
'summary' => 'Para casais que desejam contar com a Amare desde o início ou ainda estão estruturando etapas importantes.',
'scope_items' => [ 'scope_items' => [
'Planejamento e organização', 'Estruturação do planejamento',
'Gestão de etapas e prioridades', 'Cronogramas, prazos e prioridades',
'Acompanhamento de fornecedores', 'Orientação e gestão de fornecedores',
'Coordenação do grande dia', 'Alinhamento entre os envolvidos',
'Coordenação da execução',
], ],
'cta_label' => 'Quero conhecer a Essenza', 'cta_label' => 'Quero conhecer a Essenza',
'compare_heading' => 'Começar com a Amare',
'compare_summary' => 'Acompanhamento mais amplo ao longo do planejamento.',
'sort_order' => 1, 'sort_order' => 1,
], ],
[ [
'name' => 'Conduzione', 'name' => 'Conduzione',
'level' => '02 / PARCIAL', 'level' => '02 / PARCIAL',
'summary' => 'Para quem já começou e deseja estruturar o que falta, organizar fornecedores e seguir com acompanhamento profissional.', 'tag' => 'Assessoria parcial',
'subtitle' => 'Para quem já começou e quer seguir acompanhado.',
'summary' => 'Para casais que já tomaram decisões e contrataram parte dos fornecedores, mas precisam estruturar o que falta.',
'scope_items' => [ 'scope_items' => [
'Diagnóstico do planejamento', 'Diagnóstico do planejamento existente',
'Organização das pendências', 'Organização das pendências',
'Gestão dos próximos passos', 'Gestão dos fornecedores contratados',
'Coordenação do grande dia', 'Orientação para próximas decisões',
'Coordenação da execução',
], ],
'cta_label' => 'Quero conhecer a Conduzione', 'cta_label' => 'Quero conhecer a Conduzione',
'compare_heading' => 'Trazer a Amare para o caminho',
'compare_summary' => 'O planejamento existe, mas ainda há decisões e gestão pela frente.',
'sort_order' => 2, 'sort_order' => 2,
], ],
[ [
'name' => 'Grand Jour', 'name' => 'Grand Jour',
'level' => '03 / FINAL', 'level' => '03 / FINAL',
'summary' => 'Para casais que já planejaram o casamento e precisam de uma equipe para assumir alinhamentos e operação na reta final.', 'tag' => 'Assessoria final',
'subtitle' => 'O planejamento está pronto. Agora é hora de viver.',
'summary' => 'Para casais na reta final que precisam de uma equipe para assumir alinhamentos, cronograma e operação.',
'scope_items' => [ 'scope_items' => [
'Imersão no planejamento existente', 'Imersão no planejamento existente',
'Alinhamento de fornecedores', 'Conferência das informações',
'Cronograma final', 'Alinhamento dos fornecedores',
'Organização do cronograma final',
'Gestão da operação do evento', 'Gestão da operação do evento',
], ],
'cta_label' => 'Quero conhecer a Grand Jour', 'cta_label' => 'Quero conhecer a Grand Jour',
'compare_heading' => 'Entregar a operação para a Amare',
'compare_summary' => 'O projeto está pronto e o foco passa a ser alinhamento e execução.',
'sort_order' => 3, 'sort_order' => 3,
], ],
]; ];