A sophisticated, production-ready E-Commerce SPA delivering exceptional shopping experiences
Rose is a cutting-edge e-commerce platform built with modern web technologies, designed to deliver an exceptional shopping experience across all devices. The application leverages Angular 19's latest features, NX monorepo architecture, and a comprehensive suite of tools to provide scalability, maintainability, and outstanding performance.
To create a world-class e-commerce platform that combines beautiful design with powerful functionality, enabling businesses to deliver exceptional online shopping experiences.
Resource | Link | Description |
---|---|---|
๐ Production App | rose-chi-nine.vercel.app | Live application demo |
๐ Documentation | rose-d2ff.vercel.app | Comprehensive docs |
๐๏ธ Project Structure | Project Structure | Comprehensive docs |
๐ Source Code | GitHub Repository | Full source code |
๐จ Design System | Figma Design | UI/UX designs |
๐ฅ Demo Video | Demo Video | Watch the full platform demonstration |
Meet the talented individuals behind Rose E-Commerce Platform:
Role | Name | Phone | CV | ||
---|---|---|---|---|---|
Frontend Developer | Karim Ashraf Mohamed | +201007101012 | karimashraf000@gmail.com | CV | |
Frontend Developer | Reham Gomaa | +201091628541 | rehamgomaa686@gmail.com | CV | |
Frontend Developer | Maher Samy | +201557778612 | mahersamybalata@gmail.com | CV | |
Frontend Developer | Habiba Ehab | +201272691175 | Habiba.em7@gmail.com | CV | |
Frontend Developer | Mahmoud Mohamed | +201113709071 | mahmouddessoki33@gmail.com | CV |
Advanced Product Catalog
Shopping Cart & Checkout
Wishlist Management
Authentication & Profile
Personalization
Technology | Version | Purpose |
---|---|---|
Angular | 19.x | Frontend framework with signals |
TypeScript | 4.9+ | Type-safe development |
RxJS | 7.x | Reactive programming |
NgRx Signals | Latest | State management |
Technology | Purpose |
---|---|
PrimeNG | Comprehensive UI components |
PrimeFlex | Utility-first CSS framework |
PrimeIcons | Modern icon library |
SCSS | Advanced CSS preprocessing |
Technology | Purpose |
---|---|
NX | Monorepo build system |
AVIFack | Module bundling |
ESLint | Code linting |
Prettier | Code formatting |
Technology | Purpose |
---|---|
Jest | Unit testing |
Cypress | E2E testing |
Storybook | Component documentation |
Compodoc | Code documentation |
Rose follows a modular, scalable architecture pattern:
Rose Application
โโโ Core Module (Singleton services)
โโโ Shared Module (Common components)
โโโ Feature Modules
โ โโโ Auth Module
โ โโโ Products Module
โ โโโ Cart Module
โ โโโ Orders Module
โ โโโ User Module
โโโ Lazy-Loaded Routes
Ensure you have the following installed:
# 1. Clone the repository
git clone https://github.com/Reham-Gomaa/Rose.git
cd Rose
# 2. Install dependencies
npm install
# 3. Start development server
nx serve rose
# 4. Open your browser
# Navigate to http://localhost:4200
# Development server with hot reload
nx serve rose
# Build for production
nx build rose --configuration=production
# Run unit tests
nx test rose
# Run E2E tests
nx e2e rose-e2e
# Generate code coverage
nx test rose --code-coverage
# Lint the codebase
nx lint rose
# Build and serve production build locally
nx build rose --prod && nx serve rose --prod
After installation, verify everything works:
http://localhost:4200
Directory | Purpose | Contents |
---|---|---|
apps/rose/src/app/core/ |
Core application services | Singletons, guards, interceptors |
apps/rose/src/app/shared/ |
Shared components | Reusable UI components |
apps/rose/src/app/features/ |
Feature modules | Business logic modules |
libs/ |
Shared libraries | Cross-app reusable code |
tools/ |
Build and deployment | Custom scripts and tools |
// Lazy-loaded routes
const routes: Routes = [
{
path: "products",
loadChildren: () => import("./features/products/products.module").then((m) => m.ProductsModule),
},
{
path: "cart",
loadChildren: () => import("./features/cart/cart.module").then((m) => m.CartModule),
},
];
@Component({
selector: "app-product-card",
changeDetection: ChangeDetectionStrategy.OnPush,
template: `...`,
})
export class ProductCardComponent {
// Optimized component
}
<!-- AVIF with fallback -->
<picture>
<source srcset="assets/images/product.AVIF" type="image/AVIF" />
<img src="assets/images/product.jpg" alt="Product" loading="lazy" />
</picture>
Metric | Target | Current |
---|---|---|
First Contentful Paint | < 1.5s | 1.2s |
Largest Contentful Paint | < 2.5s | 2.1s |
Time to Interactive | < 3.0s | 2.8s |
Cumulative Layout Shift | < 0.1 | 0.05 |
// Example unit test
describe("ProductService", () => {
let service: ProductService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ProductService);
});
it("should fetch products", async () => {
const products = await service.getProducts();
expect(products).toBeDefined();
expect(products.length).toBeGreaterThan(0);
});
});
// Example E2E test
describe("Shopping Cart", () => {
it("should add product to cart", () => {
cy.visit("/products");
cy.get("[data-cy=product-card]").first().click();
cy.get("[data-cy=add-to-cart]").click();
cy.get("[data-cy=cart-count]").should("contain", "1");
});
});
# Install Vercel CLI
npm i -g vercel
# Deploy to production
vercel --prod
# Deploy preview
vercel
Set in Vercel dashboard:
Example :GOOGLE_MAPS_API_KEY=your_key_here
STRIPE_PUBLISHABLE_KEY=your_key_here
API_URL=https://your-api.com
# Build command
nx build rose --prod
# Publish directory
dist/apps/rose
// Secure token storage
@Injectable()
export class AuthService {
private tokenKey = "auth_token";
storeToken(token: string): void {
// Store in httpOnly cookie (server-side)
// Or secure localStorage with encryption
}
getToken(): string | null {
// Retrieve and validate token
return this.secureStorage.getItem(this.tokenKey);
}
}
<main role="main" aria-label="Product Catalog">
<section aria-labelledby="products-heading">
<h2 id="products-heading">Featured Products</h2>
<div role="grid" aria-label="Product grid">
<article role="gridcell" tabindex="0">
<!-- Product content -->
</article>
</div>
</section>
</main>
@HostListener('keydown', ['$event'])
onKeyDown(event: KeyboardEvent): void {
switch (event.key) {
case 'Enter':
case ' ':
this.onClick();
break;
case 'Escape':
this.onEscape();
break;
}
}
// assets/i18n/en.json
{
"HEADER": {
"TITLE": "Welcome to Rose",
"SUBTITLE": "Your favorite online store"
},
"PRODUCTS": {
"TITLE": "Products",
"ADD_TO_CART": "Add to Cart",
"OUT_OF_STOCK": "Out of Stock"
},
"CART": {
"TITLE": "Shopping Cart",
"TOTAL": "Total",
"CHECKOUT": "Checkout"
}
}
// RTL styles
[dir="rtl"] {
.product-card {
text-align: right;
.price {
margin-left: 0;
margin-right: auto;
}
}
}
## ๐ค Contributing
We welcome contributions from the community! Here's how you can help:
### ๐ ๏ธ Development Workflow
#### 1. Fork & Clone
```bash
# Fork the repository on GitHub
# Clone your fork
# Create and switch to feature branch
git checkout -b feature/amazing-feature
# Or for bug fixes
git checkout -b fix/bug-description
# Install dependencies
npm install
# Start development server
nx serve rose
# Run tests while developing
nx test rose --watch
# Use conventional commits
git commit -m "feat: add product comparison feature"
git commit -m "fix: resolve cart calculation bug"
git commit -m "docs: update installation guide"
This project is licensed under the MIT License - see the LICENSE file for details.
Star โญ this repository if you found it helpful!