Select a theme mode
Navigation
Select a theme mode

Arquitetura Frontend Agnóstica de Framework

10 min de leitura
Rascunho

Este documento define os princípios arquitetônicos para construção de aplicações frontend modernas. A arquitetura utiliza uma abordagem modular e orientada por funcionalidades para melhorar a escalabilidade e manutenibilidade, independentemente do framework específico (por exemplo, React, Vue, Solid ou Svelte).

Convenção de Nomenclatura de Arquivos: Use kebab-case para todos os nomes de arquivos e diretórios (por exemplo, my-component.js ou user-profile/). Os nomes dos componentes no código devem seguir a convenção padrão para o framework ou biblioteca escolhida (por exemplo, PascalCase).

Diretório Raiz: src/

O diretório src/ contém todo o código fonte da aplicação.

1. domains/ - Módulos de Funcionalidades

O diretório domains/ contém as funcionalidades da aplicação. Cada sub-diretório em domains/ é um módulo de funcionalidade auto-contido que encapsula toda a lógica para um domínio de negócio específico (por exemplo, user-profile/ ou product-listing/). Esta estrutura permite melhor separação de código e permite que equipes trabalhem em funcionalidades independentemente.

1.0. Estrutura de Domínio

Cada pasta de funcionalidade encapsula todo o código para essa funcionalidade. Coloque arquivos de teste em sub-diretórios __tests__ dentro do diretório do código sendo testado. Um domínio típico pode incluir alguns ou todos os seguintes sub-diretórios. Crie essas pastas somente quando necessário.

  • README.md: Explica o propósito do domínio, principais responsabilidades, regras de negócio e interações.

  • assets/: Recursos estáticos específicos da funcionalidade organizados por tipo:

    • assets/images/ (opcional): Imagens específicas do domínio, ilustrações e gráficos.
    • assets/icons/ (opcional): Ícones específicos da funcionalidade e recursos SVG.
    • assets/fonts/ (opcional): Recursos tipográficos específicos do domínio.
    • assets/videos/ (opcional): Conteúdo multimídia relacionado à funcionalidade.
    • assets/documents/ (opcional): PDFs específicos do domínio, guias ou arquivos de documentação.

    Nota: Os recursos do domínio seguem o mesmo padrão organizacional dos recursos globais (veja seção 4), mas contêm conteúdo específico apenas para aquela funcionalidade. Crie subpastas de recursos somente quando você tiver múltiplos recursos daquele tipo. Domínios simples podem colocar todos os recursos diretamente na pasta assets/.

  • components/: Componentes de UI usados apenas dentro desta funcionalidade.

  • logic/: Módulos contendo lógica de estado ou de negócio. Para domínios complexos, isso pode ser dividido em application/ e domain/ como descrito abaixo.

  • views/: Componentes de apresentação de alto nível. Uma rota renderiza uma view.

  • [feature-name]-routes.js: Definições de rotas para a funcionalidade (para roteamento baseado em configuração).

  • store/ (opcional): Módulos de gerenciamento de estado específicos da funcionalidade.

  • types/ (opcional): Definições de tipos TypeScript específicas do domínio.

  • translations/ (opcional): Arquivos de internacionalização para a funcionalidade.

  • utils/ (opcional): Funções auxiliares usadas apenas dentro da funcionalidade.

  • layouts/ (opcional): Componentes de layout usados apenas por views dentro desta funcionalidade.

1.1. Avançado: Separando Lógica de Aplicação e Lógica de Domínio

Para domínios com complexidade significativa de negócio, é altamente recomendado separar ainda mais a lógica em duas categorias distintas: Lógica de Aplicação e Lógica de Domínio (Modelos). Este é um princípio fundamental do Domain-Driven Design (DDD) que melhora muito a testabilidade e clareza.

  • Lógica de Domínio (logic/domain/ ou logic/models/): Este é o núcleo da sua funcionalidade. Contém regras de negócio e comportamentos puros e agnósticos de framework. Um modelo é uma representação de software de um conceito do mundo real (ex., um ShoppingCart ou um User). Ele não sabe nada sobre a UI, APIs ou o framework escolhido.
  • Lógica de Aplicação (logic/application/ ou logic/use-cases/): Esta camada orquestra a lógica de domínio. Atua como ponte entre a UI e os modelos de domínio. Hooks, controllers ou composables ficam aqui. São responsáveis por lidar com entrada do usuário, buscar dados e chamar métodos nos modelos de domínio.

Exemplo: Um Domínio de Carrinho de Compras

  1. O Modelo de Domínio (domains/shopping-cart/logic/domain/cart.js)

Esta classe pura representa a ideia de um carrinho e aplica suas regras.

   // Este é o "modelo". É pura lógica de negócio.  
   export class Cart {  
      constructor(items = []) { this.items = items; }  
     addItem(newItem) {  
       if (newItem.stock < 1) { throw new Error("Não é possível adicionar itens fora de estoque."); }  
       this.items.push(newItem);  
     }  
     calculateTotal() { return this.items.reduce((total, item) => total + item.price,
     0); }  
   }
  1. A Lógica de Aplicação (domains/shopping-cart/logic/application/use-cart.js)

Este hook React usa o modelo para conectá-lo à aplicação.

   // A Lógica de Aplicação (domains/shopping-cart/logic/application/use-cart.js)  
   
   // Este hook React usa o modelo para conectá-lo à aplicação.  
   
   import { Cart } from `../domain/cart.js`;  
   import { api } from `../../../services/api.js`;  
   import { useState, useEffect } from 'react';  
   export function useCart() {  
     const [cartModel, setCartModel] = useState(new Cart());  
     const [isLoading, setIsLoading] = useState(false);  
     useEffect(() => {  
       setIsLoading(true);  
       api.get(`/cart`).then(data => setCartModel(new Cart(data.items))).finally(() => setIsLoading(false));  
     }, []);  
     function handleAddItemToCart(item) {  
       const newCart = new Cart([...cartModel.items]);  
       try {  
         newCart.addItem(item); // Use a lógica de negócio do modelo  
         setCartModel(newCart);  
       } catch (error) { alert(error.message); }  
     }  
     return { cart: cartModel, isLoading, handleAddItemToCart };  
   }

1.2. Compartilhamento de Código Entre Domínios: Um Anti-Padrão

Importar código diretamente entre domínios é um anti-padrão. Isso cria acoplamento forte e prejudica a modularidade.

A Solução: Promover Código Compartilhado
Se a lógica de um domínio for necessária em outro, promova-a para um diretório global (src/utils/, src/logic/, etc.) e faça ambos os domínios importarem de lá.

1.3. Comunicação Entre Domínios: Um Anti-Padrão

Assim como importações diretas de código são proibidas, comunicação direta em tempo de execução (ex., um domínio chamando uma função em outro) também é um anti-padrão.

A Solução: Mediar com um Event Bus Global
Domínios devem se comunicar indiretamente através de um event bus global (um sistema publish/subscribe), provavelmente definido em src/services/event-bus.js.

  • Publish: Um domínio envia um evento para o bus, sem saber quem está ouvindo.
  • Subscribe: Outros domínios ouvem eventos pelos quais se interessam.

Isso garante que os domínios permaneçam completamente desacoplados.

2. ui/ - Componentes de UI Globais

A biblioteca central para componentes de UI globalmente reutilizáveis. Não use barrel files (index.js).

  • ui/core/: Blocos de construção atômicos e abstratos (ex., button, input).
  • ui/patterns/ (Opcional): Componentes compostos para tarefas comuns e opinativas de UI (ex., confirm-modal).
  • ui/lab/ (Opcional): Componentes experimentais ou altamente especializados.

3. Roteamento

  • Baseado em Configuração (React Router, Vue Router): Um diretório central router/ agrega configurações de rotas do arquivo [feature-name]-routes.js de cada domínio.
  • Baseado em Arquivos (Next.js, SvelteKit): Um diretório de nível superior src/pages/ ou src/routes/ define a estrutura de URL. Esses arquivos devem ser enxutos, buscando dados e renderizando uma view do diretório domains/ relevante.

4. Outros Diretórios Globais

  • layouts/: Templates de estrutura de página global (ex., app shell).
  • assets/: Recursos estáticos globais organizados por tipo:
    • assets/images/: Logos da marca, backgrounds de hero, ilustrações globais e imagens placeholder.
    • assets/fonts/: Recursos tipográficos como web fonts (arquivos .woff2, .woff, .ttf).
    • assets/icons/: Sistemas de ícones incluindo sprites SVG, arquivos favicon e recursos de ícones globais.
    • assets/videos/: Vídeos da marca, vídeos de fundo e outros conteúdos multimídia.
    • assets/documents/: PDFs globais, conteúdo baixável e arquivos de documentação.
  • styles/: Folhas de estilo globais, resets CSS e design tokens (theme.css).
  • logic/: Lógica de negócio ou de estado global.
  • utils/: Funções utilitárias globais e sem estado.
  • services/: Serviços globais e compartilhados que lidam com preocupações transversais ou interações de infraestrutura. Exemplos incluem clientes de API, um event bus global, serviços de log ou wrappers de API do navegador.
  • store/: Gerenciamento de estado global.
  • types/: Tipos TypeScript compartilhados globalmente.

5. Testes e Documentação

  • Co-localização: Coloque testes unitários em um sub-diretório __tests__/. Coloque arquivos README.md dentro de qualquer pasta significativa para explicar seu propósito.
  • Nível de Projeto: Use um tests/ na raiz para testes E2E e um docs/ para documentação de alto nível. O diretório docs/ deve conter:
    • architecture.md: Este documento.
    • onboarding-guide.md: Instruções para novos desenvolvedores.
    • adr/: Um diretório para Registros de Decisão Arquitetônica (ADRs).

6. Relacionamento com Arquitetura de Slice Vertical

Esta arquitetura é uma aplicação direta da filosofia da Arquitetura de Slice Vertical (VSA), adaptada para desenvolvimento frontend moderno. Em vez de organizar código por camadas técnicas (ex., uma pasta global components/, uma pasta global hooks/), organiza código por funcionalidade.

  • Alta Coesão: Todo o código necessário para uma única funcionalidade (a UI, lógica, recursos) fica junto em um lugar (domains/[feature-name]/), tornando fácil raciocinar sobre e modificar.
  • Baixo Acoplamento: Regras rígidas contra comunicação direta inter-domínios garantem que funcionalidades são independentes e podem ser desenvolvidas em paralelo sem interferir umas com as outras.
  • Adaptação Frontend: Em um contexto backend, um slice vertical vai do endpoint da API até o banco de dados. Nesta arquitetura frontend, um slice vai da interface do usuário (a URL e a view) até a camada de cliente da API (services/api/).

7. Glossário

  • ADR (Registro de Decisão Arquitetônica): Um documento que captura uma decisão arquitetônica importante, seu contexto e as consequências. ADRs fornecem um registro histórico de por que o sistema é construído da maneira que é.
  • Anti-Padrão: Uma resposta comum a um problema recorrente que parece ser uma boa solução, mas no final cria mais problemas.
  • Lógica de Aplicação: A camada que orquestra modelos de domínio e os conecta à UI e infraestrutura. Frequentemente implementada como hooks ou controllers.
  • Barrel File: Um único arquivo index.js que exporta todos os outros módulos em um diretório. Desencorajado nesta arquitetura para melhorar o tree-shaking.
  • Co-localização: A prática de colocar arquivos relacionados juntos no mesmo diretório. Nesta arquitetura, testes (__tests__/) e documentação (README.md) são co-localizados com o código que descrevem.
  • Coesão: O grau até o qual os elementos dentro de um módulo pertencem juntos. Esta arquitetura visa alta coesão agrupando todo código relacionado a uma única funcionalidade dentro da mesma pasta de domínio.
  • Componente Core: Um componente de UI global de ui/core/ que é atômico, abstrato e altamente reutilizável (ex., button, input).
  • Acoplamento: O grau até o qual um módulo depende de outro. Esta arquitetura visa baixo acoplamento proibindo comunicação direta entre domínios.
  • Domínio / Funcionalidade: Um slice vertical auto-contido da aplicação correspondente a uma capacidade de negócio específica.
  • Event Bus: Um mecanismo global publish-subscribe que permite diferentes partes de uma aplicação (como domínios) se comunicarem sem estarem diretamente cientes umas das outras.
  • Módulo Global: Um módulo localizado diretamente sob src/ que fornece funcionalidade compartilhada e transversal para toda a aplicação (ex., ui/, utils/, services/).
  • Modelo (Modelo de Domínio): Uma representação de software pura e agnóstica de framework de um conceito de negócio do mundo real (ex., uma classe ShoppingCart). Contém dados e as regras de negócio que se aplicam a ele.
  • Componente Pattern: Um componente de UI global de ui/patterns/ que é composto de vários componentes core para resolver uma tarefa comum e opinativa de UI (ex., confirm-modal).
  • Arquitetura de Slice Vertical: Um padrão arquitetônico onde código é organizado por funcionalidade (um “slice vertical”) ao invés de por camada técnica (uma “camada horizontal”).
  • View: Um componente de apresentação de alto nível, tipicamente em domains/[feature-name]/views/. O trabalho primário de uma rota é renderizar uma view.

8. Resumo de Escopos de Diretórios

  • Escopo de Funcionalidade (dentro de domains/[feature-name]/): Todos os diretórios relacionados à operação de uma funcionalidade (components/, logic/, views/, etc.).
  • Escopo Global (filhos diretos de src/): ui/, router/, layouts/, assets/, styles/, logic/, utils/, services/, store/ e types/.
  • Nível de Projeto (raiz): Um diretório docs/ para documentação de alto nível e um diretório tests/ para testes E2E/integração.

9. Princípios Arquitetônicos Chave

  • Modularidade: Organização orientada por domínio suporta desenvolvimento paralelo.
  • Reutilização: Diretórios globais promovem princípios DRY para lógica e UI comuns.
  • Separação Clara: Escopos explícitos para lógica específica de funcionalidade, global, de aplicação e de domínio minimizam a carga cognitiva.
  • Manutenibilidade: Testes e documentação co-localizados melhoram qualidade de código e longevidade.
  • Independência de Framework: Estes princípios são adaptáveis a qualquer framework frontend moderno.
  • Autonomia de Equipe: Fronteiras claras empoderam equipes a possuírem funcionalidades com interferência reduzida.

10. Representação

  • src/
    Root Directory
    • domains/
      Feature Modules
      Domain-Driven Architecture

      Each domain is a self-contained feature module following Domain-Driven Design principles. Think of them as vertical slices of your application that contain everything needed for a specific business capability.

      • shopping-cart/
        Primary Example
        • README.md
          Documentation
        • __tests__/
          Co-located Tests
          Test Co-location Principle

          Tests live in __tests__/ subdirectories next to the code they test. This improves discoverability and maintains clear relationships between implementation and validation.

          • cart.test.js
          • use-cart.test.js
        • shopping-cart-routes.js
          Config-based Routing
          Configuration-Based Routes

          For React Router, Vue Router, etc. Each domain exports its route configuration to be assembled by the central router.

        • logic/
          Business Logic
          Domain-Driven Design Layers

          Complex domains separate pure business logic (domain/) from framework-specific application logic (application/). This separation improves testability and maintainability.

          • domain/
            Pure Models
            • cart.js
              Domain Model
              Pure Business Logic

              Framework-agnostic classes with business rules. Example: Cart class with addItem(), calculateTotal() methods that enforce business constraints.

            • product.js
              Domain Model
            • __tests__/
              Model Tests
          • application/
            App Orchestration
            • use-cart.js
              React Hook
              Application Logic Layer

              Connects domain models to UI and infrastructure. Handles user input, data fetching, and coordinates between domain models and external services.

            • cart-controller.js
              Controller
            • __tests__/
              Hook Tests
        • components/
          Domain Components
          • cart-item.astro
          • cart-summary.astro
          • add-to-cart-button.astro
          • __tests__/
            Component Tests
        • views/
          Page Views
          View Components

          Top-level presentational components that routes render. They orchestrate data and compose smaller components to build complete user interfaces.

          • cart-view.astro
          • checkout-view.astro
          • __tests__/
            View Tests
        • translations/
          i18n Files
          • en.json
          • pt-br.json
          • es.json
        • types/
          TypeScript Types
          • cart.ts
          • product.ts
        • assets/
          Domain Assets
          Optional Asset Organization

          Asset subfolders are optional. Create them only when you have multiple assets of that type. Simple domains might place all assets directly in the assets/ folder.

          • images/
            Domain Images
            • empty-cart-illustration.svg
              Cart Illustration
            • product-placeholder.png
              Product Placeholder
          • icons/
            Domain Icons
            • cart-icon.svg
              Cart Icon
            • checkout-icons.svg
              Checkout Icons
        • utils/
          Domain Utilities
          • cart-helpers.js
          • price-formatters.js
      • user-profile/
        Secondary Example
        • README.md
          Documentation
        • __tests__/
          Co-located Tests
        • user-profile-routes.js
          Route Config
        • components/
          UI Components
          Domain-Specific Components

          Components here are domain-specific and not shared across features. If a component needs to be used elsewhere, promote it to the global ui/ directory.

          • profile-avatar.astro
          • settings-form.astro
          • profile-stats.astro
          • __tests__/
            Component Tests
        • views/
          Page Views
          • profile-view.astro
          • settings-view.astro
          • edit-profile-view.astro
        • logic/
          Business Logic
          • user-service.js
          • profile-validator.js
          • __tests__/
            Logic Tests
      • authentication/
        Domain Example
        Authentication as a Domain

        Authentication treated as a first-class business domain with its own vertical slice. Contains all auth-related UI, business logic, and state management rather than being scattered globally.

        • README.md
          Domain Documentation
        • __tests__/
          Co-located Tests
        • authentication-routes.js
          Auth Routes Config
        • components/
          Auth UI Components
          • login-form.astro
            Login Form
          • register-form.astro
            Registration
          • password-reset-form.astro
            Password Reset
          • auth-guard.astro
            Route Protection
          • __tests__/
            Component Tests
        • views/
          Auth Views
          • login-view.astro
            Login Page
          • register-view.astro
            Registration Page
          • forgot-password-view.astro
            Password Recovery
          • __tests__/
            View Tests
        • logic/
          Auth Business Logic
          • domain/
            Pure Auth Models
            • user.js
              Domain Model
              User Domain Model

              Pure User class with authentication business rules - password validation, role checking, session expiry logic. Framework-agnostic business behavior.

            • session.js
              Session Model
            • auth-token.js
              Token Model
            • __tests__/
              Domain Tests
          • application/
            Auth Orchestration
            • use-auth.js
              Auth Hook
              Authentication Orchestration

              React hook that coordinates auth domain models with UI and API. Handles login/logout flows, token management, and user state.

            • auth-controller.js
              Auth Controller
            • permission-manager.js
              Permission Logic
            • __tests__/
              Application Tests
        • store/
          Auth State
          • auth-store.js
            User Session
          • permission-store.js
            User Permissions
          • __tests__/
            Store Tests
        • types/
          Auth Types
          • user.ts
            User Interfaces
          • auth.ts
            Auth Interfaces
          • permissions.ts
            Permission Types
        • utils/
          Auth Utilities
          • token-helpers.js
            JWT Utils
          • password-validators.js
            Password Rules
          • auth-formatters.js
            Data Formatting
          • __tests__/
            Util Tests
        • translations/
          Auth i18n
          • en.json
            English Auth Text
          • pt-br.json
            Portuguese Auth Text
          • es.json
            Spanish Auth Text
        • assets/
          Auth Assets
          • login-bg.jpg
            Login Background
          • auth-icons.svg
            Auth Icons
      • product-catalog/
        Domain Example
      • order-management/
        Domain Example
      • ❌ ANTI-PATTERN: Direct Imports
        DON'T DO THIS
        Inter-Domain Import Anti-Pattern

        NEVER import directly between domains (e.g., shopping-cart importing from user-profile). This creates tight coupling. Instead, promote shared code to global directories or use the event bus for communication.

        • ❌ import { userService } from '../user-profile/logic'
          Tight Coupling
        • ✅ Use Event Bus Communication
          Decoupled
        • ✅ Promote to Global Directories
          Shared Code
    • ui/
      UI System
      Global UI System

      The global UI system with a three-tier structure: core (atomic components), patterns (composed solutions), and lab (experimental features). No barrel files (index.js) allowed.

      • core/
        Atomic Components
        Atomic, Abstract Building Blocks

        Atomic, context-free building blocks like buttons and inputs. These are the foundation of your design system - highly reusable and make no assumptions about their usage.

        • button.astro
          Foundational
        • input-field.astro
          Foundational
        • card.astro
          Layout
        • modal-shell.astro
          Overlay
        • badge.astro
          Indicator
        • spinner.astro
          Feedback
        • checkbox.astro
          Form Control
        • __tests__/
          Core Tests
      • patterns/
        Composed Components
        Composed UI Patterns

        Opinionated combinations of core components that solve common UI patterns. They trade flexibility for consistency and development speed.

        • user-avatar-with-status.astro
          User Pattern
        • product-card.astro
          E-commerce
        • confirm-modal.astro
          Confirmation
        • data-table.astro
          Data Display
        • search-with-filters.astro
          Search Pattern
        • notification-toast.astro
          Feedback
        • __tests__/
          Pattern Tests
      • lab/
        Experimental
        Experimental Components

        Safe space for experimental components and proof-of-concepts. Components must meet stability criteria before graduating to core or patterns.

        • virtual-scroll-list.astro
          Performance
        • ai-chat-interface.astro
          AI/ML
        • gesture-detector.astro
          Interaction
        • experimental-chart.astro
          Data Viz
        • __tests__/
          Experimental Tests
    • 🚦 ROUTING APPROACHES
      Two Strategies
      Choose Your Routing Strategy

      The architecture supports both configuration-based routing (React Router, Vue Router) and file-based routing (Next.js, SvelteKit, Astro). Choose based on your framework.

      • router/
        Config-based Routing
        Configuration-Based Routing

        For React Router, Vue Router, etc. Central router aggregates route configurations from each domain's [feature-name]-routes.js file.

        • app-router.js
          Central Router
          Central Route Assembly

          Imports and combines all domain route configurations into a single router instance. Each domain maintains its own routes file.

        • route-guards.js
          Auth Guards
        • router-config.js
          Global Config
        • __tests__/
          Router Tests
      • pages/
        File-based Routing
        File-Based Routing

        For Next.js, SvelteKit, Astro, etc. Filesystem structure defines URL structure. Keep route files lean - they should orchestrate, not implement.

        • index.astro
          Home Route
        • [slug].astro
          Dynamic Route
          Keep Routes Lean

          Route files should be thin orchestration layers. Import and render views from the appropriate domain directory.

        • about.astro
          Static Route
        • 404.astro
          Error Page
        • cart/
          Domain Routes
          • index.astro
            /cart
          • checkout.astro
            /cart/checkout
        • profile/
          Nested Routes
          • index.astro
            /profile
          • settings.astro
            /profile/settings
    • layouts/
      Global Structure
      Global Page Templates

      Reusable page structure templates that wrap your views. Domain-specific layouts should live within their respective domain directories.

      • main-layout.astro
        App Shell
      • auth-layout.astro
        Login/Register
      • admin-layout.astro
        Admin Panel
      • minimal-layout.astro
        Landing Pages
      • __tests__/
        Layout Tests
    • assets/
      Global Assets
      Global Static Resources

      Global static resources like images and fonts. Domain-specific assets should live in their respective domain/assets/ directories.

      • images/
        Global Images
        • logo.svg
          Brand Logo
        • hero-bg.jpg
          Hero Background
        • placeholder.png
          Global Placeholder
      • fonts/
        Typography
        • inter.woff2
          System Font
        • roboto-mono.woff2
          Code Font
      • icons/
        Icon System
        • sprite.svg
          SVG Sprite
        • favicon.ico
          Browser Icon
      • videos/
        Multimedia Content
        • hero-video.mp4
          Brand Video
        • background-loop.webm
          Background Video
      • documents/
        Global Documents
        • terms-of-service.pdf
          Legal Document
        • user-manual.pdf
          User Guide
    • styles/
      Global Stylesheets
      Global Styling System

      Global styling system including CSS resets, base element styles, design tokens, and theme variables. Component-specific styles should be co-located with their components.

      • global.css
        Global Styles
      • theme.css
        Design Tokens
      • reset.css
        CSS Reset
      • variables.css
        CSS Variables
      • typography.css
        Text Styles
    • utils/
      Pure Functions
      Global Utility Functions

      Stateless utility functions used across multiple domains. These should be pure functions with no side effects - formatters, validators, data transformers, etc.

      • formatters.js
        Data Formatting
      • validators.js
        Input Validation
      • date-utils.js
        Date Helpers
      • string-utils.js
        String Manipulation
      • array-helpers.js
        Array Operations
      • __tests__/
        Utility Tests
    • logic/
      Shared Business Logic
      Cross-Domain Business Logic

      Global business logic that's shared across multiple domains. This is different from utils - it contains stateful logic, complex business rules, and cross-cutting concerns.

      • shared-rules.js
        Business Rules
      • permissions-engine.js
        Access Control
      • business-constants.js
        Domain Constants
      • cross-domain-workflows.js
        Multi-Domain Logic
      • __tests__/
        Logic Tests
    • services/
      Infrastructure Services
      Cross-Cutting Infrastructure

      Global services for cross-cutting concerns and infrastructure interactions. Includes API clients, event bus, logging, and browser API wrappers.

      • http-client.js
        API Client
      • api-config.js
        API Configuration
      • event-bus.js
        Inter-Domain Communication
        Domain Communication Hub

        The event bus is the ONLY way domains should communicate with each other. It provides publish/subscribe functionality to maintain loose coupling between features.

      • logger.js
        Logging Service
      • browser-apis.js
        Browser Wrappers
      • __tests__/
        Service Tests
    • store/
      Global State
      Application-Wide State

      Global state management for truly application-wide concerns like theme, notifications, and global UI state. Domain-specific state should remain in domain stores.

      • app-store.js
        Core App State
      • theme-store.js
        Theme Management
      • notification-store.js
        Global Notifications
      • global-ui-state.js
        UI State
      • __tests__/
        Store Tests
    • types/
      Global Types
      Shared Type Definitions

      TypeScript type definitions used across multiple domains. Domain-specific types should remain in their respective domain/types/ directories.

      • api.ts
        API Interfaces
      • common.ts
        Shared Types
      • events.ts
        Event Bus Types
      • ui.ts
        UI Component Types
      • routing.ts
        Route Types
    • 📋 ARCHITECTURE SUMMARY
      Key Principles
      Framework-Agnostic Principles

      This architecture promotes modularity, clear separation of concerns, and framework independence through Vertical Slice Architecture principles adapted for frontend development.

      • ✅ High Cohesion
        Feature-Driven
      • ✅ Low Coupling
        Event Bus Communication
      • ✅ Test Co-location
        __tests__/ Everywhere
      • ✅ Framework Agnostic
        Adaptable Structure
      • ✅ Domain-Driven Design
        Pure Domain Models
      • ✅ Kebab-case File Names
        Consistent Naming