+ 9 Linhas alteradas: 9 adições e 0 exclusões Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -0,0 +1,9 @@ # GEMINI_API_KEY: Required for Gemini AI API calls. # AI Studio automatically injects this at runtime from user secrets. # Users configure this via the Secrets panel in the AI Studio UI. GEMINI_API_KEY="MY_GEMINI_API_KEY" # APP_URL: The URL where this applet is hosted. # AI Studio automatically injects this at runtime with the Cloud Run service URL. # Used for self-referential links, OAuth callbacks, and API endpoints. APP_URL="MY_APP_URL" .gitignore + 8 Linhas alteradas: 8 adições e 0 exclusões Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -0,0 +1,8 @@ node_modules/ build/ dist/ coverage/ .DS_Store *.log .env* !.env.example README.md + 14 - 5 Linhas alteradas: 14 adições e 5 exclusões. Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -1,11 +1,20 @@
The fastest path from prompt to production with Gemini.
This contains everything you need to run your app locally. Start building View your app in AI Studio: https://ai.studio/apps/acdd4626-9cbe-4478-a4aa-e2088eb9d4d2 ## Run Locally **Prerequisites:** Node.js 1. Install dependencies: `npm install` 2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key 3. Run the app: `npm run dev` firebase-applet-config.json + 10 Linhas alteradas: 10 adições e 0 exclusões Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -0,0 +1,10 @@ { "projectId": "gen-lang-client-0982718841", "appId": "1:653624667754:web:82ac310ef27c543f0ba413", "apiKey": "AIzaSyAU5dM3t8M8S3PL875heLgvtIZheFVz2uo", "authDomain": "gen-lang-client-0982718841.firebaseapp.com", "firestoreDatabaseId": "ai-studio-acdd4626-9cbe-4478-a4aa-e2088eb9d4d2", "storageBucket": "gen-lang-client-0982718841.firebasestorage.app", "messagingSenderId": "653624667754", "measurementId": "" } firebase-blueprint.json + 76 Linhas alteradas: 76 adições e 0 exclusões Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -0,0 +1,76 @@ { "entities": { "Product": { "title": "Product", "description": "A box/product available for sale", "type": "object", "properties": { "name": { "type": "string", "description": "Name of the box" }, "description": { "type": "string", "description": "Short description" }, "price": { "type": "number", "description": "Price in BRL" }, "stock": { "type": "integer", "description": "Available quantity" }, "imageUrl": { "type": "string", "description": "URL of the product image" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["name", "price", "stock", "imageUrl"] }, "Order": { "title": "Order", "description": "A customer order", "type": "object", "properties": { "userId": { "type": "string" }, "items": { "type": "array" }, "total": { "type": "number" }, "status": { "type": "string", "enum": ["pending", "paid", "shipped", "cancelled"] }, "paymentMethod": { "type": "string" }, "customerInfo": { "type": "object" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["userId", "items", "total", "status"] }, "User": { "title": "User", "description": "User profile and role", "type": "object", "properties": { "email": { "type": "string" }, "role": { "type": "string", "enum": ["admin", "customer"] }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["email", "role"] }, "FeaturedItem": { "title": "Featured Item", "description": "An image/item to be displayed in the featured section", "type": "object", "properties": { "title": { "type": "string", "description": "Title of the highlight" }, "imageUrl": { "type": "string", "description": "URL of the image" }, "category": { "type": "string", "enum": ["enel", "sabesp"], "description": "Category of the highlight" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["imageUrl", "category"] }, "ProjectPrice": { "title": "Project Price", "description": "Pricing for electrical projects", "type": "object", "properties": { "name": { "type": "string", "description": "Name of the project type" }, "basePrice": { "type": "number", "description": "Price per unit" }, "unitName": { "type": "string", "description": "Unit (e.g., m², point)" }, "description": { "type": "string", "description": "Details about the project" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["name", "basePrice", "unitName"] } }, "firestore": { "products": { "schema": "Product", "description": "List of boxes for sale" }, "orders": { "schema": "Order", "description": "Customer purchase history" }, "users": { "schema": "User", "description": "User roles and metadata" }, "featured": { "schema": "FeaturedItem", "description": "Highlights for the home page" }, "project_prices": { "schema": "ProjectPrice", "description": "Pricing table for electrical projects" } } } firestore.rules + 67 Linhas alteradas: 67 adições e 0 exclusões Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -0,0 +1,67 @@ rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // =============================================================== // Assumed Data Model // =============================================================== // Collection: products // Fields: name (string), description (string), price (number), stock (number), imageUrl (string), createdAt (timestamp) // // Collection: orders // Fields: userId (string), items (array), total (number), status (string), paymentMethod (string), customerInfo (map), createdAt (timestamp) // // Collection: users // Fields: email (string), role (string), createdAt (timestamp) // // Collection: project_prices // Fields: name (string), basePrice (number), unitName (string), description (string), createdAt (timestamp) // =============================================================== // Helper Functions function isAuthenticated() { return request.auth != null; } function isAdmin() { return isAuthenticated() && request.auth.token.email == "amewengenhariaeletrica@gmail.com" && request.auth.token.email_verified == true; } function isOwner(userId) { return isAuthenticated() && request.auth.uid == userId; } // Products: Everyone can read, only admins can write match /products/{productId} { allow read: if true; allow write: if isAdmin(); } // Orders: Users can read/write their own, admins can read/write all match /orders/{orderId} { allow read: if isAdmin() || (isAuthenticated() && resource.data.userId == request.auth.uid); allow create: if isAuthenticated(); allow update, delete: if isAdmin(); } // Users: Users can read/write their own, admins can read/write all match /users/{userId} { allow read: if isAdmin() || isOwner(userId); allow create: if isAuthenticated() && isOwner(userId); allow update: if isAdmin() || (isOwner(userId) && request.resource.data.role == resource.data.role); } // Featured Items: Everyone can read, only admins can write match /featured/{itemId} { allow read: if true; allow write: if isAdmin(); } // Project Prices: Everyone can read, only admins can write match /project_prices/{priceId} { allow read: if true; allow write: if isAdmin(); } } } index.html + 13 Linhas alteradas: 13 adições e 0 exclusões Número da linha do arquivo original Número da linha diferente Mudança de linha diferencial @@ -0,0 +1,13 @@{product.description}
Selecione o tipo de projeto e informe a metragem ou quantidade de pontos para receber uma estimativa automática de valores.
Transparência Total
Valores baseados em nossa tabela atualizada.
Suporte via WhatsApp
Tire suas dúvidas técnicas em tempo real.
Total Estimado
R$ {total.toFixed(2)}
Online agora
Olá! Como podemos ajudar você hoje?
Parece que você ainda não adicionou nenhuma caixa mágica.
Começar a comprarR$ {item.price.toFixed(2)}
R$ {(item.price * item.quantity).toFixed(2)}
Obrigado pela sua compra. Você receberá um e-mail com os detalhes do pedido em breve.
Tem alguma dúvida sobre nossas caixas ou quer um pedido personalizado? Nossa equipe está pronta para te ajudar.
amewengenhariaeletrica@gmail.com
Telefones
(11) 4558-6016
(11) 97187-8021 (WhatsApp)
Localização
Av. Santo Antonio, 1968
Bela Vista - Osasco, SP
Especialistas em Caixas de Luz e Hidrômetros. Qualidade, segurança e conformidade técnica para sua instalação.
{f.desc}
Nossa equipe técnica analisa seu projeto e garante que sua instalação esteja em total conformidade com as normas da Enel e Sabesp, evitando reprovações.
Falar com Consultor{item.label}
As caixas mais desejadas pelos nossos clientes.
Acesse sua conta para gerenciar seus pedidos e preferências.
{searchTerm ? `${filteredProducts.length} ${filteredProducts.length === 1 ? 'produto encontrado' : 'produtos encontrados'}` : 'Explore nossa coleção completa de embalagens e presentes.'}
Nenhum produto encontrado para sua busca.