[{"data":1,"prerenderedAt":884},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Farquitectura-modular-nuxt-layers-b2b":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":313,"author":314,"authorType":315,"body":316,"category":863,"date":864,"description":865,"extension":866,"image":867,"lang":868,"meta":869,"navigation":22,"ogImage":870,"path":871,"readTime":872,"seo":873,"stem":874,"tags":875,"translations":879,"updated":315,"__hash__":883},"blog\u002Fblog\u002Farquitectura-modular-nuxt-layers-b2b.md","Arquitectura Modular con Nuxt Layers: Organizando Funciones B2B sin Monolitos Espagueti","Equipo Nuxfire",null,{"type":317,"value":318,"toc":855},"minimark",[319,323,339,342,347,350,384,395,405,407,414,421,655,657,664,669,802,809,811,815,839,842,851],[320,321,322],"p",{},"A medida que un producto SaaS crece, la complejidad del código tiende a explotar. Los componentes de checkout se mezclan con las reglas de autenticación, las pantallas de administración comparten directorios con las de los usuarios comunes y un cambio en el modelo de base de datos rompe tres pantallas distintas sin previo aviso.",[320,324,325,326,330,331,334,335,338],{},"La solución de ",[327,328,329],"strong",{},"Nuxt 4"," para este dilema se llama ",[327,332,333],{},"Nuxt Layers",". En ",[327,336,337],{},"Nuxfire",", usamos Layers para construir módulos aislados que se pueden activar o desactivar con una sola línea de configuración.",[340,341],"hr",{},[343,344,346],"h2",{"id":345},"qué-es-una-nuxt-layer","¿Qué es una Nuxt Layer?",[320,348,349],{},"Una Layer en Nuxt es un paquete completo y autónomo que puede contener:",[351,352,353,366,372,378],"ul",{},[354,355,356,357,361,362,365],"li",{},"Páginas (",[358,359,360],"code",{},"pages\u002F",") y layouts (",[358,363,364],{},"layouts\u002F",").",[354,367,368,369,365],{},"Componentes Vue accesibles (",[358,370,371],{},"components\u002F",[354,373,374,375,365],{},"Rutas de servidor y procedures tRPC (",[358,376,377],{},"server\u002F",[354,379,380,381,365],{},"Fragmentos del schema de Drizzle ORM (",[358,382,383],{},"schema.ts",[320,385,386,387,390,391,394],{},"Esto significa que la funcionalidad de ",[327,388,389],{},"Facturación (Billing)",", por ejemplo, existe totalmente contenida dentro de ",[358,392,393],{},"layers\u002Fbilling\u002F",".",[396,397,402],"pre",{"className":398,"code":400,"language":401},[399],"language-text","layers\u002F\n├── admin\u002F          # Panel de administración de la plataforma, MFA y registros de auditoría\n├── billing\u002F        # Planes de Stripe, checkout, webhooks y portal del cliente\n├── teams\u002F          # Multi-tenancy B2B, invitaciones de miembros y RBAC granular\n├── notifications\u002F  # Hub de WebSockets con Durable Objects e historial en SQLite\n└── kanban\u002F         # Módulo opcional de tableros y tarjetas interactivas\n","text",[358,403,400],{"__ignoreMap":404},"",[340,406],{},[343,408,410,411],{"id":409},"el-contrato-de-capas-nuxfiremanifest","El Contrato de Capas: ",[358,412,413],{},"@nuxfire\u002Fmanifest",[320,415,416,417,420],{},"Para que cada capa sea verdaderamente modular sin un acoplamiento rígido, cada layer exporta un manifiesto mediante el helper compartido ",[358,418,419],{},"defineLayerManifest()",":",[396,422,426],{"className":423,"code":424,"language":425,"meta":404,"style":404},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","import { defineLayerManifest } from \"@nuxfire\u002Fmanifest\";\n\nexport default defineLayerManifest({\n  name: \"billing\",\n  description: \"Gestión de suscripciones de Stripe, webhooks y portal de clientes\",\n  dependencies: [\"teams\"],\n  routes: [\"\u002Fbilling\", \"\u002Fbilling\u002Fplans\"],\n  navigation: {\n    title: \"Suscripción y Facturación\",\n    icon: \"i-lucide-credit-card\",\n    path: \"\u002Fbilling\"\n  }\n});\n","typescript",[358,427,428,464,470,488,507,524,547,578,589,606,623,638,644],{"__ignoreMap":404},[429,430,433,437,441,445,448,451,455,458,461],"span",{"class":431,"line":432},"line",1,[429,434,436],{"class":435},"sRxSC","import",[429,438,440],{"class":439},"swvn1"," {",[429,442,444],{"class":443},"ss--_"," defineLayerManifest",[429,446,447],{"class":439}," }",[429,449,450],{"class":435}," from",[429,452,454],{"class":453},"siCPE"," \"",[429,456,413],{"class":457},"sLACW",[429,459,460],{"class":453},"\"",[429,462,463],{"class":439},";\n",[429,465,467],{"class":431,"line":466},2,[429,468,469],{"emptyLinePlaceholder":22},"\n",[429,471,473,476,479,482,485],{"class":431,"line":472},3,[429,474,475],{"class":435},"export",[429,477,478],{"class":435}," default",[429,480,444],{"class":481},"sD0ED",[429,483,484],{"class":443},"(",[429,486,487],{"class":439},"{\n",[429,489,491,495,497,499,502,504],{"class":431,"line":490},4,[429,492,494],{"class":493},"squCx","  name",[429,496,420],{"class":439},[429,498,454],{"class":453},[429,500,501],{"class":457},"billing",[429,503,460],{"class":453},[429,505,506],{"class":439},",\n",[429,508,510,513,515,517,520,522],{"class":431,"line":509},5,[429,511,512],{"class":493},"  description",[429,514,420],{"class":439},[429,516,454],{"class":453},[429,518,519],{"class":457},"Gestión de suscripciones de Stripe, webhooks y portal de clientes",[429,521,460],{"class":453},[429,523,506],{"class":439},[429,525,527,530,532,535,537,540,542,545],{"class":431,"line":526},6,[429,528,529],{"class":493},"  dependencies",[429,531,420],{"class":439},[429,533,534],{"class":443}," [",[429,536,460],{"class":453},[429,538,539],{"class":457},"teams",[429,541,460],{"class":453},[429,543,544],{"class":443},"]",[429,546,506],{"class":439},[429,548,550,553,555,557,559,562,564,567,569,572,574,576],{"class":431,"line":549},7,[429,551,552],{"class":493},"  routes",[429,554,420],{"class":439},[429,556,534],{"class":443},[429,558,460],{"class":453},[429,560,561],{"class":457},"\u002Fbilling",[429,563,460],{"class":453},[429,565,566],{"class":439},",",[429,568,454],{"class":453},[429,570,571],{"class":457},"\u002Fbilling\u002Fplans",[429,573,460],{"class":453},[429,575,544],{"class":443},[429,577,506],{"class":439},[429,579,581,584,586],{"class":431,"line":580},8,[429,582,583],{"class":493},"  navigation",[429,585,420],{"class":439},[429,587,588],{"class":439}," {\n",[429,590,592,595,597,599,602,604],{"class":431,"line":591},9,[429,593,594],{"class":493},"    title",[429,596,420],{"class":439},[429,598,454],{"class":453},[429,600,601],{"class":457},"Suscripción y Facturación",[429,603,460],{"class":453},[429,605,506],{"class":439},[429,607,609,612,614,616,619,621],{"class":431,"line":608},10,[429,610,611],{"class":493},"    icon",[429,613,420],{"class":439},[429,615,454],{"class":453},[429,617,618],{"class":457},"i-lucide-credit-card",[429,620,460],{"class":453},[429,622,506],{"class":439},[429,624,626,629,631,633,635],{"class":431,"line":625},11,[429,627,628],{"class":493},"    path",[429,630,420],{"class":439},[429,632,454],{"class":453},[429,634,561],{"class":457},[429,636,637],{"class":453},"\"\n",[429,639,641],{"class":431,"line":640},12,[429,642,643],{"class":439},"  }\n",[429,645,647,650,653],{"class":431,"line":646},13,[429,648,649],{"class":439},"}",[429,651,652],{"class":443},")",[429,654,463],{"class":439},[340,656],{},[343,658,660,661],{"id":659},"activar-y-desactivar-módulos-en-configts","Activar y Desactivar Módulos en ",[358,662,663],{},"config.ts",[320,665,666,667,420],{},"Imagina que estás creando un producto ligero y no necesitas el módulo de Kanban ni el complejo sistema de notificaciones. En Nuxfire, controlas los módulos en el archivo raíz ",[358,668,663],{},[396,670,672],{"className":423,"code":671,"language":425,"meta":404,"style":404},"export const config = {\n  domain: \"tusaas.com\",\n  layers: {\n    core: [\"teams\", \"billing\", \"notifications\", \"admin\"],\n    features: {\n      kanban: false, \u002F\u002F Desactívalo fácilmente sin romper el build\n    }\n  }\n};\n",[358,673,674,692,708,717,762,771,788,793,797],{"__ignoreMap":404},[429,675,676,678,682,686,690],{"class":431,"line":432},[429,677,475],{"class":435},[429,679,681],{"class":680},"srJo8"," const",[429,683,685],{"class":684},"s91G_"," config",[429,687,689],{"class":688},"sGXK2"," =",[429,691,588],{"class":439},[429,693,694,697,699,701,704,706],{"class":431,"line":466},[429,695,696],{"class":493},"  domain",[429,698,420],{"class":439},[429,700,454],{"class":453},[429,702,703],{"class":457},"tusaas.com",[429,705,460],{"class":453},[429,707,506],{"class":439},[429,709,710,713,715],{"class":431,"line":472},[429,711,712],{"class":493},"  layers",[429,714,420],{"class":439},[429,716,588],{"class":439},[429,718,719,722,724,726,728,730,732,734,736,738,740,742,744,747,749,751,753,756,758,760],{"class":431,"line":490},[429,720,721],{"class":493},"    core",[429,723,420],{"class":439},[429,725,534],{"class":443},[429,727,460],{"class":453},[429,729,539],{"class":457},[429,731,460],{"class":453},[429,733,566],{"class":439},[429,735,454],{"class":453},[429,737,501],{"class":457},[429,739,460],{"class":453},[429,741,566],{"class":439},[429,743,454],{"class":453},[429,745,746],{"class":457},"notifications",[429,748,460],{"class":453},[429,750,566],{"class":439},[429,752,454],{"class":453},[429,754,755],{"class":457},"admin",[429,757,460],{"class":453},[429,759,544],{"class":443},[429,761,506],{"class":439},[429,763,764,767,769],{"class":431,"line":509},[429,765,766],{"class":493},"    features",[429,768,420],{"class":439},[429,770,588],{"class":439},[429,772,773,776,778,782,784],{"class":431,"line":526},[429,774,775],{"class":493},"      kanban",[429,777,420],{"class":439},[429,779,781],{"class":780},"s8HiA"," false",[429,783,566],{"class":439},[429,785,787],{"class":786},"ss7Ak"," \u002F\u002F Desactívalo fácilmente sin romper el build\n",[429,789,790],{"class":431,"line":549},[429,791,792],{"class":439},"    }\n",[429,794,795],{"class":431,"line":580},[429,796,643],{"class":439},[429,798,799],{"class":431,"line":591},[429,800,801],{"class":439},"};\n",[320,803,804,805,808],{},"El script de build inspecciona este archivo y arma la composición final en ",[358,806,807],{},"apps\u002Fapp\u002Fnuxt.config.ts"," de forma 100% automática.",[340,810],{},[343,812,814],{"id":813},"beneficios-prácticos-para-equipos-y-desarrolladores","Beneficios Prácticos para Equipos y Desarrolladores",[816,817,818,824,830],"ol",{},[354,819,820,823],{},[327,821,822],{},"Testabilidad Aislada",": Cada capa tiene sus propias pruebas unitarias y de integración.",[354,825,826,829],{},[327,827,828],{},"Reutilización Inmediata",": Crea un nuevo producto copiando solo las capas que necesitas.",[354,831,832,835,836,838],{},[327,833,834],{},"Contexto Ideal para las IA",": Cuando le pides a una IA (Cursor, Claude Code) que edite el checkout, solo necesita leer los archivos dentro de ",[358,837,393],{},", sin cargar en memoria miles de líneas irrelevantes.",[320,840,841],{},"¿Listo para transformar tu productividad y construir con la arquitectura correcta desde el principio?",[320,843,844],{},[845,846,848],"a",{"href":847},"\u002Fes#pricing",[327,849,850],{},"Obtén acceso inmediato al código fuente de Nuxfire y al Grupo VIP →",[852,853,854],"style",{},"html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s8HiA, html code.shiki .s8HiA{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}",{"title":404,"searchDepth":466,"depth":466,"links":856},[857,858,860,862],{"id":345,"depth":466,"text":346},{"id":409,"depth":466,"text":859},"El Contrato de Capas: @nuxfire\u002Fmanifest",{"id":659,"depth":466,"text":861},"Activar y Desactivar Módulos en config.ts",{"id":813,"depth":466,"text":814},"Ingeniería de Software","2026-09-15","Cómo desacoplar la facturación con Stripe, los workspaces multi-tenant y el panel de administración con Nuxt Layers y monorepos Bun para crear SaaS limpios y sostenibles.","md","\u002Fimages\u002Fblog\u002Fnuxt-layers-modular-b2b-es.svg","es",{},"\u002Fimages\u002Fblog\u002Fnuxt-layers-modular-b2b-es.png","\u002Fblog\u002Farquitectura-modular-nuxt-layers-b2b","8 min",{"title":313,"description":865},"blog\u002Farquitectura-modular-nuxt-layers-b2b",[333,876,877,878],"Arquitectura Modular","B2B SaaS","Clean Code",{"en":880,"pt-br":881,"es":882},"modular-architecture-nuxt-layers-b2b","arquitetura-modular-nuxt-layers-b2b","arquitectura-modular-nuxt-layers-b2b","LxIEll_aJYj2iZ_ENsnsY-_liUYDjuGF-q96AZLQFeQ",1790707501117]