228 lines
10 KiB
Go
228 lines
10 KiB
Go
package persona
|
|
|
|
// Lifestyle contains the persona's interests, fashion sense, and vacation style.
|
|
// Generated in Stage 3 of the specgen pipeline using identity and psychology as inputs.
|
|
type Lifestyle struct {
|
|
// Interests captures the persona's hobbies and passions.
|
|
Interests Interests `json:"interests" yaml:"interests"`
|
|
|
|
// FashionSense describes the persona's clothing style preferences.
|
|
FashionSense FashionSense `json:"fashion_sense" yaml:"fashion_sense"`
|
|
|
|
// VacationStyle describes travel preferences.
|
|
VacationStyle VacationStyle `json:"vacation_style" yaml:"vacation_style"`
|
|
}
|
|
|
|
// Interests captures a persona's hobbies and passions across 5 categories.
|
|
type Interests struct {
|
|
// Creative interests: art, music, writing, photography, etc.
|
|
Creative []string `json:"creative" yaml:"creative"`
|
|
|
|
// Active interests: sports, fitness, dance, hiking, etc.
|
|
Active []string `json:"active" yaml:"active"`
|
|
|
|
// Social interests: dining, travel, nightlife, community, etc.
|
|
Social []string `json:"social" yaml:"social"`
|
|
|
|
// Intellectual interests: books, philosophy, science, tech, etc.
|
|
Intellectual []string `json:"intellectual" yaml:"intellectual"`
|
|
|
|
// Lifestyle interests: cooking, gardening, home decor, wellness, etc.
|
|
Lifestyle []string `json:"lifestyle" yaml:"lifestyle"`
|
|
}
|
|
|
|
// FashionSense describes a persona's clothing style.
|
|
type FashionSense struct {
|
|
// Primary is the dominant fashion context name.
|
|
Primary FashionContextName `json:"primary" yaml:"primary"`
|
|
|
|
// Secondary is a secondary style influence (optional).
|
|
Secondary FashionContextName `json:"secondary,omitempty" yaml:"secondary,omitempty"`
|
|
|
|
// SignatureDetails are specific personal styling touches (e.g., "always wears gold hoops").
|
|
SignatureDetails []string `json:"signature_details,omitempty" yaml:"signature_details,omitempty"`
|
|
}
|
|
|
|
// VacationStyle describes a persona's travel preferences.
|
|
type VacationStyle struct {
|
|
// Primary is the dominant vacation type: "beach", "city", "adventure", "luxury", "cultural".
|
|
Primary string `json:"primary" yaml:"primary"`
|
|
|
|
// Activities are preferred vacation activities.
|
|
Activities []string `json:"activities,omitempty" yaml:"activities,omitempty"`
|
|
|
|
// DreamDestinations are top travel destinations.
|
|
DreamDestinations []string `json:"dream_destinations,omitempty" yaml:"dream_destinations,omitempty"`
|
|
}
|
|
|
|
// FashionContextName identifies one of the 15 defined fashion contexts.
|
|
type FashionContextName string
|
|
|
|
const (
|
|
FashionClassicMinimalist FashionContextName = "classic_minimalist"
|
|
FashionStreetwearChic FashionContextName = "streetwear_chic"
|
|
FashionBohemianSpirit FashionContextName = "bohemian_free_spirit"
|
|
FashionAthleisurePro FashionContextName = "athleisure_pro"
|
|
FashionBusinessCasual FashionContextName = "business_casual"
|
|
FashionRomanticFeminine FashionContextName = "romantic_feminine"
|
|
FashionEdgyAlternative FashionContextName = "edgy_alternative"
|
|
FashionCoastalCasual FashionContextName = "coastal_casual"
|
|
FashionUrbanProfessional FashionContextName = "urban_professional"
|
|
FashionFestivalGlam FashionContextName = "festival_glam"
|
|
FashionPreppyClassic FashionContextName = "preppy_classic"
|
|
FashionDarkAcademia FashionContextName = "dark_academia"
|
|
FashionCottagecore FashionContextName = "cottagecore"
|
|
FashionY2KRevival FashionContextName = "y2k_revival"
|
|
FashionLuxeLoungewear FashionContextName = "luxe_loungewear"
|
|
)
|
|
|
|
// FashionContext describes a named fashion style with styling details.
|
|
type FashionContext struct {
|
|
// Name is the canonical identifier.
|
|
Name FashionContextName `json:"name" yaml:"name"`
|
|
|
|
// Description is a one-line style summary.
|
|
Description string `json:"description" yaml:"description"`
|
|
|
|
// KeyPieces are the defining wardrobe items.
|
|
KeyPieces []string `json:"key_pieces" yaml:"key_pieces"`
|
|
|
|
// Brands are representative brands for this aesthetic.
|
|
Brands []string `json:"brands" yaml:"brands"`
|
|
|
|
// Silhouette describes the overall shape/fit profile.
|
|
Silhouette string `json:"silhouette" yaml:"silhouette"`
|
|
}
|
|
|
|
// AllFashionContexts returns the catalog of all 15 defined fashion contexts.
|
|
func AllFashionContexts() []FashionContext {
|
|
return []FashionContext{
|
|
{
|
|
Name: FashionClassicMinimalist,
|
|
Description: "Clean lines, neutral palette, and timeless silhouettes",
|
|
KeyPieces: []string{"crisp white shirt", "tailored trousers", "structured blazer", "minimal gold jewelry"},
|
|
Brands: []string{"COS", "Everlane", "The Row", "A.P.C."},
|
|
Silhouette: "slim, structured, minimal layering",
|
|
},
|
|
{
|
|
Name: FashionStreetwearChic,
|
|
Description: "Urban-influenced with oversized fits, sneakers, and bold logos",
|
|
KeyPieces: []string{"oversized hoodie", "cargo pants", "chunky sneakers", "bucket hat"},
|
|
Brands: []string{"Off-White", "Supreme", "Stüssy", "PANGAIA"},
|
|
Silhouette: "oversized tops, tapered or wide bottoms",
|
|
},
|
|
{
|
|
Name: FashionBohemianSpirit,
|
|
Description: "Free-flowing fabrics, earthy tones, and global-inspired prints",
|
|
KeyPieces: []string{"flowy maxi dress", "embroidered blouse", "woven bag", "layered necklaces"},
|
|
Brands: []string{"Free People", "Spell", "Anthropologie", "Zimmermann"},
|
|
Silhouette: "loose, flowing, layered",
|
|
},
|
|
{
|
|
Name: FashionAthleisurePro,
|
|
Description: "Performance fabrics worn stylishly beyond the gym",
|
|
KeyPieces: []string{"seamless leggings", "sports bra", "zip-up hoodie", "white sneakers"},
|
|
Brands: []string{"Lululemon", "Alo Yoga", "Gymshark", "Vuori"},
|
|
Silhouette: "form-fitting, streamlined",
|
|
},
|
|
{
|
|
Name: FashionBusinessCasual,
|
|
Description: "Polished and professional with approachable comfort",
|
|
KeyPieces: []string{"fitted blazer", "straight-leg trousers", "silk blouse", "loafers"},
|
|
Brands: []string{"Banana Republic", "Theory", "J.Crew", "& Other Stories"},
|
|
Silhouette: "tailored, clean lines, moderate coverage",
|
|
},
|
|
{
|
|
Name: FashionRomanticFeminine,
|
|
Description: "Soft, delicate pieces with florals, lace, and pastel tones",
|
|
KeyPieces: []string{"floral midi dress", "lace cami", "ballet flats", "pearl accessories"},
|
|
Brands: []string{"Reformation", "Loveshackfancy", "Hill House Home", "Rixo"},
|
|
Silhouette: "fitted bodice with full or flowy skirts",
|
|
},
|
|
{
|
|
Name: FashionEdgyAlternative,
|
|
Description: "Dark palette, punk and rock influences, leather and hardware",
|
|
KeyPieces: []string{"leather jacket", "black skinny jeans", "combat boots", "silver chain jewelry"},
|
|
Brands: []string{"AllSaints", "Saint Laurent", "Helmut Lang", "Rick Owens"},
|
|
Silhouette: "slim, angular, layered with hardware",
|
|
},
|
|
{
|
|
Name: FashionCoastalCasual,
|
|
Description: "Relaxed, sun-kissed looks inspired by beach and ocean lifestyles",
|
|
KeyPieces: []string{"linen shorts", "striped tee", "espadrilles", "canvas tote"},
|
|
Brands: []string{"Outerknown", "Marine Layer", "Vilebrequin", "Solid & Striped"},
|
|
Silhouette: "relaxed, breezy, effortless",
|
|
},
|
|
{
|
|
Name: FashionUrbanProfessional,
|
|
Description: "Sharp city-dweller style blending fashion and function",
|
|
KeyPieces: []string{"tailored coat", "ankle boots", "structured handbag", "monochrome sets"},
|
|
Brands: []string{"Toteme", "Cos", "Sandro", "BOSS"},
|
|
Silhouette: "sleek, polished, statement outerwear",
|
|
},
|
|
{
|
|
Name: FashionFestivalGlam,
|
|
Description: "Bold prints, glitter, and maximalist looks built for events",
|
|
KeyPieces: []string{"crop top with sequins", "fringe jacket", "platform sandals", "body chains"},
|
|
Brands: []string{"House of CB", "PrettyLittleThing", "Fashion Nova", "Nasty Gal"},
|
|
Silhouette: "skin-baring, layered accessories, high visual impact",
|
|
},
|
|
{
|
|
Name: FashionPreppyClassic,
|
|
Description: "Collegiate-inspired clean aesthetics with a polished finish",
|
|
KeyPieces: []string{"polo shirt", "chino trousers", "boat shoes", "cable-knit sweater"},
|
|
Brands: []string{"Ralph Lauren", "Brooks Brothers", "Tommy Hilfiger", "Lacoste"},
|
|
Silhouette: "classic proportions, clean and put-together",
|
|
},
|
|
{
|
|
Name: FashionDarkAcademia,
|
|
Description: "Literary and scholarly aesthetic with earth tones and vintage pieces",
|
|
KeyPieces: []string{"tweed blazer", "turtleneck", "pleated skirt", "oxford shoes"},
|
|
Brands: []string{"Cordera", "Mango", "H&M Studio", "Massimo Dutti"},
|
|
Silhouette: "layered, traditional, intellectual",
|
|
},
|
|
{
|
|
Name: FashionCottagecore,
|
|
Description: "Pastoral romanticism with floral prints, ruffles, and natural textures",
|
|
KeyPieces: []string{"prairie dress", "puff-sleeve blouse", "wicker bag", "mary jane shoes"},
|
|
Brands: []string{"Doen", "For Love & Lemons", "Batsheva", "Emilia Wickstead"},
|
|
Silhouette: "loose, romantic, tiered or smocked",
|
|
},
|
|
{
|
|
Name: FashionY2KRevival,
|
|
Description: "Early 2000s nostalgia with low-rise, butterfly prints, and metallics",
|
|
KeyPieces: []string{"low-rise jeans", "halter top", "platform boots", "mini bag"},
|
|
Brands: []string{"Blumarine", "Diesel", "Juicy Couture", "Paris Hilton Collection"},
|
|
Silhouette: "crop tops with low-rise bottoms, skin-baring midriff",
|
|
},
|
|
{
|
|
Name: FashionLuxeLoungewear,
|
|
Description: "Elevated comfort dressing in premium fabrics and tonal sets",
|
|
KeyPieces: []string{"cashmere loungewear set", "silk slip", "fuzzy slides", "oversized cashmere cardigan"},
|
|
Brands: []string{"Skims", "Eberjey", "Brunello Cucinelli", "Leset"},
|
|
Silhouette: "relaxed but polished, tonal and monochromatic",
|
|
},
|
|
}
|
|
}
|
|
|
|
// FashionContextFor returns the FashionContext definition for the given name.
|
|
// Returns a zero-value FashionContext if the name is not found.
|
|
func FashionContextFor(name FashionContextName) FashionContext {
|
|
for _, fc := range AllFashionContexts() {
|
|
if fc.Name == name {
|
|
return fc
|
|
}
|
|
}
|
|
return FashionContext{}
|
|
}
|
|
|
|
// AllFashionContextNames returns all 15 fashion context names.
|
|
func AllFashionContextNames() []FashionContextName {
|
|
all := AllFashionContexts()
|
|
names := make([]FashionContextName, len(all))
|
|
for i, fc := range all {
|
|
names[i] = fc.Name
|
|
}
|
|
return names
|
|
}
|