diff --git a/backend/README.md b/backend/README.md
index 433651d..2195d95 100644
--- a/backend/README.md
+++ b/backend/README.md
@@ -1,6 +1,6 @@
-# PragmaStack Backend API
+# Syndarix Backend API
-> The pragmatic, production-ready FastAPI backend for PragmaStack.
+> The pragmatic, production-ready FastAPI backend for Syndarix.
## Overview
diff --git a/backend/app/core/config.py b/backend/app/core/config.py
index 7b78b9c..43e1ec0 100644
--- a/backend/app/core/config.py
+++ b/backend/app/core/config.py
@@ -5,7 +5,7 @@ from pydantic_settings import BaseSettings
class Settings(BaseSettings):
- PROJECT_NAME: str = "PragmaStack"
+ PROJECT_NAME: str = "Syndarix"
VERSION: str = "1.0.0"
API_V1_STR: str = "/api/v1"
diff --git a/frontend/README.md b/frontend/README.md
index d98ff2c..2e99185 100755
--- a/frontend/README.md
+++ b/frontend/README.md
@@ -1,4 +1,4 @@
-# PragmaStack - Frontend
+# Syndarix - Frontend
Production-ready Next.js 16 frontend with TypeScript, authentication, admin panel, and internationalization.
diff --git a/frontend/docs/DEMO_MODE.md b/frontend/docs/DEMO_MODE.md
index 6a32dbc..a62be7d 100644
--- a/frontend/docs/DEMO_MODE.md
+++ b/frontend/docs/DEMO_MODE.md
@@ -273,7 +273,7 @@ NEXT_PUBLIC_DEMO_MODE=true npm run dev
**1. Fork Repository**
```bash
-gh repo fork your-repo/fast-next-template
+git clone https://gitea.pragmazest.com/cardosofelipe/syndarix.git
```
**2. Connect to Vercel**
diff --git a/frontend/docs/I18N.md b/frontend/docs/I18N.md
index 2593041..f901a3e 100644
--- a/frontend/docs/I18N.md
+++ b/frontend/docs/I18N.md
@@ -1,6 +1,6 @@
# Internationalization (i18n) Guide
-This document describes the internationalization implementation in the PragmaStack.
+This document describes the internationalization implementation in Syndarix.
## Overview
diff --git a/frontend/docs/branding/02-visual-identity.md b/frontend/docs/branding/02-visual-identity.md
index 53d69d3..92ffca4 100644
--- a/frontend/docs/branding/02-visual-identity.md
+++ b/frontend/docs/branding/02-visual-identity.md
@@ -4,10 +4,10 @@
## Logo
-The **PragmaStack** logo represents the core values of the project: structure, speed, and clarity.
+The **Syndarix** logo represents the core values of the project: structure, speed, and clarity.
-
+
The Stack: Geometric layers representing the full-stack architecture.
@@ -16,7 +16,7 @@ The **PragmaStack** logo represents the core values of the project: structure, s
For smaller contexts (favicons, headers), we use the simplified icon:
-
+
For now, we use the **Lucide React** icon set for all iconography. Icons should be used sparingly and meaningfully to enhance understanding, not just for decoration.
diff --git a/frontend/docs/branding/README.md b/frontend/docs/branding/README.md
index b95a121..f053e1e 100644
--- a/frontend/docs/branding/README.md
+++ b/frontend/docs/branding/README.md
@@ -1,6 +1,6 @@
# Branding Guidelines
-Welcome to the **PragmaStack** branding guidelines. This section defines who we are, how we speak, and how we look.
+Welcome to the **Syndarix** branding guidelines. This section defines who we are, how we speak, and how we look.
## Contents
diff --git a/frontend/docs/design-system/00-quick-start.md b/frontend/docs/design-system/00-quick-start.md
index 9dbd73e..c989992 100644
--- a/frontend/docs/design-system/00-quick-start.md
+++ b/frontend/docs/design-system/00-quick-start.md
@@ -1,6 +1,6 @@
# Quick Start Guide
-Get up and running with the PragmaStack design system immediately. This guide covers the essential patterns you need to build 80% of interfaces.
+Get up and running with the Syndarix design system immediately. This guide covers the essential patterns you need to build 80% of interfaces.
---
diff --git a/frontend/docs/design-system/08-ai-guidelines.md b/frontend/docs/design-system/08-ai-guidelines.md
index 614819c..39f329f 100644
--- a/frontend/docs/design-system/08-ai-guidelines.md
+++ b/frontend/docs/design-system/08-ai-guidelines.md
@@ -1,6 +1,6 @@
# AI Code Generation Guidelines
-**For AI Assistants**: This document contains strict rules for generating code in the PragmaStack project. Follow these rules to ensure generated code matches the design system perfectly.
+**For AI Assistants**: This document contains strict rules for generating code in the Syndarix project. Follow these rules to ensure generated code matches the design system perfectly.
---
diff --git a/frontend/docs/design-system/99-reference.md b/frontend/docs/design-system/99-reference.md
index 2e2bf49..23f21eb 100644
--- a/frontend/docs/design-system/99-reference.md
+++ b/frontend/docs/design-system/99-reference.md
@@ -1,6 +1,6 @@
# Quick Reference
-**Bookmark this page** for instant lookups of colors, spacing, typography, components, and common patterns. Your go-to cheat sheet for the PragmaStack design system.
+**Bookmark this page** for instant lookups of colors, spacing, typography, components, and common patterns. Your go-to cheat sheet for the Syndarix design system.
---
diff --git a/frontend/docs/design-system/README.md b/frontend/docs/design-system/README.md
index 99c37fe..13e75f6 100644
--- a/frontend/docs/design-system/README.md
+++ b/frontend/docs/design-system/README.md
@@ -1,6 +1,6 @@
# Design System Documentation
-**PragmaStack Design System** - A comprehensive guide to building consistent, accessible, and beautiful user interfaces.
+**Syndarix Design System** - A comprehensive guide to building consistent, accessible, and beautiful user interfaces.
---
diff --git a/frontend/e2e/homepage.spec.ts b/frontend/e2e/homepage.spec.ts
index 3e82121..18e803c 100644
--- a/frontend/e2e/homepage.spec.ts
+++ b/frontend/e2e/homepage.spec.ts
@@ -14,7 +14,7 @@ test.describe('Homepage - Desktop Navigation', () => {
test('should display header with logo and navigation', async ({ page }) => {
// Logo should be visible
- await expect(page.getByRole('link', { name: /PragmaStack/i })).toBeVisible();
+ await expect(page.getByRole('link', { name: /Syndarix/i })).toBeVisible();
// Desktop navigation links should be visible (use locator to find within header)
const header = page.locator('header').first();
@@ -23,8 +23,8 @@ test.describe('Homepage - Desktop Navigation', () => {
});
test('should display GitHub link with star badge', async ({ page }) => {
- // Find GitHub link by checking for one that has github.com in href
- const githubLink = page.locator('a[href*="github.com"]').first();
+ // Find GitHub link by checking for one that has gitea.pragmazest.com in href
+ const githubLink = page.locator('a[href*="gitea.pragmazest.com"]').first();
await expect(githubLink).toBeVisible();
await expect(githubLink).toHaveAttribute('target', '_blank');
});
@@ -120,7 +120,7 @@ test.describe('Homepage - Hero Section', () => {
test('should navigate to GitHub when clicking View on GitHub', async ({ page }) => {
const githubLink = page.getByRole('link', { name: /View on GitHub/i }).first();
await expect(githubLink).toBeVisible();
- await expect(githubLink).toHaveAttribute('href', expect.stringContaining('github.com'));
+ await expect(githubLink).toHaveAttribute('href', expect.stringContaining('gitea.pragmazest.com'));
});
test('should navigate to components when clicking Explore Components', async ({ page }) => {
@@ -250,7 +250,7 @@ test.describe('Homepage - Feature Sections', () => {
});
test('should display philosophy section', async ({ page }) => {
- await expect(page.getByRole('heading', { name: /Why PragmaStack/i })).toBeVisible();
+ await expect(page.getByRole('heading', { name: /Why Syndarix/i })).toBeVisible();
await expect(page.getByText(/MIT licensed/i).first()).toBeVisible();
});
});
@@ -264,7 +264,7 @@ test.describe('Homepage - Footer', () => {
// Scroll to footer
await page.locator('footer').scrollIntoViewIfNeeded();
- await expect(page.getByText(/PragmaStack. MIT Licensed/i)).toBeVisible();
+ await expect(page.getByText(/Syndarix. MIT Licensed/i)).toBeVisible();
});
});
@@ -285,7 +285,7 @@ test.describe('Homepage - Accessibility', () => {
});
test('should have accessible links with proper attributes', async ({ page }) => {
- const githubLink = page.locator('a[href*="github.com"]').first();
+ const githubLink = page.locator('a[href*="gitea.pragmazest.com"]').first();
await expect(githubLink).toHaveAttribute('target', '_blank');
await expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer');
});
diff --git a/frontend/public/mockServiceWorker.js b/frontend/public/mockServiceWorker.js
index b68694a..6951ed1 100644
--- a/frontend/public/mockServiceWorker.js
+++ b/frontend/public/mockServiceWorker.js
@@ -7,42 +7,42 @@
* - Please do NOT modify this file.
*/
-const PACKAGE_VERSION = '2.12.3';
-const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82';
-const IS_MOCKED_RESPONSE = Symbol('isMockedResponse');
-const activeClientIds = new Set();
+const PACKAGE_VERSION = '2.12.3'
+const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
+const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
+const activeClientIds = new Set()
addEventListener('install', function () {
- self.skipWaiting();
-});
+ self.skipWaiting()
+})
addEventListener('activate', function (event) {
- event.waitUntil(self.clients.claim());
-});
+ event.waitUntil(self.clients.claim())
+})
addEventListener('message', async function (event) {
- const clientId = Reflect.get(event.source || {}, 'id');
+ const clientId = Reflect.get(event.source || {}, 'id')
if (!clientId || !self.clients) {
- return;
+ return
}
- const client = await self.clients.get(clientId);
+ const client = await self.clients.get(clientId)
if (!client) {
- return;
+ return
}
const allClients = await self.clients.matchAll({
type: 'window',
- });
+ })
switch (event.data) {
case 'KEEPALIVE_REQUEST': {
sendToClient(client, {
type: 'KEEPALIVE_RESPONSE',
- });
- break;
+ })
+ break
}
case 'INTEGRITY_CHECK_REQUEST': {
@@ -52,12 +52,12 @@ addEventListener('message', async function (event) {
packageVersion: PACKAGE_VERSION,
checksum: INTEGRITY_CHECKSUM,
},
- });
- break;
+ })
+ break
}
case 'MOCK_ACTIVATE': {
- activeClientIds.add(clientId);
+ activeClientIds.add(clientId)
sendToClient(client, {
type: 'MOCKING_ENABLED',
@@ -67,51 +67,54 @@ addEventListener('message', async function (event) {
frameType: client.frameType,
},
},
- });
- break;
+ })
+ break
}
case 'CLIENT_CLOSED': {
- activeClientIds.delete(clientId);
+ activeClientIds.delete(clientId)
const remainingClients = allClients.filter((client) => {
- return client.id !== clientId;
- });
+ return client.id !== clientId
+ })
// Unregister itself when there are no more clients
if (remainingClients.length === 0) {
- self.registration.unregister();
+ self.registration.unregister()
}
- break;
+ break
}
}
-});
+})
addEventListener('fetch', function (event) {
- const requestInterceptedAt = Date.now();
+ const requestInterceptedAt = Date.now()
// Bypass navigation requests.
if (event.request.mode === 'navigate') {
- return;
+ return
}
// Opening the DevTools triggers the "only-if-cached" request
// that cannot be handled by the worker. Bypass such requests.
- if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
- return;
+ if (
+ event.request.cache === 'only-if-cached' &&
+ event.request.mode !== 'same-origin'
+ ) {
+ return
}
// Bypass all requests when there are no active clients.
// Prevents the self-unregistered worked from handling requests
// after it's been terminated (still remains active until the next reload).
if (activeClientIds.size === 0) {
- return;
+ return
}
- const requestId = crypto.randomUUID();
- event.respondWith(handleRequest(event, requestId, requestInterceptedAt));
-});
+ const requestId = crypto.randomUUID()
+ event.respondWith(handleRequest(event, requestId, requestInterceptedAt))
+})
/**
* @param {FetchEvent} event
@@ -119,18 +122,23 @@ addEventListener('fetch', function (event) {
* @param {number} requestInterceptedAt
*/
async function handleRequest(event, requestId, requestInterceptedAt) {
- const client = await resolveMainClient(event);
- const requestCloneForEvents = event.request.clone();
- const response = await getResponse(event, client, requestId, requestInterceptedAt);
+ const client = await resolveMainClient(event)
+ const requestCloneForEvents = event.request.clone()
+ const response = await getResponse(
+ event,
+ client,
+ requestId,
+ requestInterceptedAt,
+ )
// Send back the response clone for the "response:*" life-cycle events.
// Ensure MSW is active and ready to handle the message, otherwise
// this message will pend indefinitely.
if (client && activeClientIds.has(client.id)) {
- const serializedRequest = await serializeRequest(requestCloneForEvents);
+ const serializedRequest = await serializeRequest(requestCloneForEvents)
// Clone the response so both the client and the library could consume it.
- const responseClone = response.clone();
+ const responseClone = response.clone()
sendToClient(
client,
@@ -151,11 +159,11 @@ async function handleRequest(event, requestId, requestInterceptedAt) {
},
},
},
- responseClone.body ? [serializedRequest.body, responseClone.body] : []
- );
+ responseClone.body ? [serializedRequest.body, responseClone.body] : [],
+ )
}
- return response;
+ return response
}
/**
@@ -167,30 +175,30 @@ async function handleRequest(event, requestId, requestInterceptedAt) {
* @returns {Promise}
*/
async function resolveMainClient(event) {
- const client = await self.clients.get(event.clientId);
+ const client = await self.clients.get(event.clientId)
if (activeClientIds.has(event.clientId)) {
- return client;
+ return client
}
if (client?.frameType === 'top-level') {
- return client;
+ return client
}
const allClients = await self.clients.matchAll({
type: 'window',
- });
+ })
return allClients
.filter((client) => {
// Get only those clients that are currently visible.
- return client.visibilityState === 'visible';
+ return client.visibilityState === 'visible'
})
.find((client) => {
// Find the client ID that's recorded in the
// set of clients that have registered the worker.
- return activeClientIds.has(client.id);
- });
+ return activeClientIds.has(client.id)
+ })
}
/**
@@ -203,34 +211,36 @@ async function resolveMainClient(event) {
async function getResponse(event, client, requestId, requestInterceptedAt) {
// Clone the request because it might've been already used
// (i.e. its body has been read and sent to the client).
- const requestClone = event.request.clone();
+ const requestClone = event.request.clone()
function passthrough() {
// Cast the request headers to a new Headers instance
// so the headers can be manipulated with.
- const headers = new Headers(requestClone.headers);
+ const headers = new Headers(requestClone.headers)
// Remove the "accept" header value that marked this request as passthrough.
// This prevents request alteration and also keeps it compliant with the
// user-defined CORS policies.
- const acceptHeader = headers.get('accept');
+ const acceptHeader = headers.get('accept')
if (acceptHeader) {
- const values = acceptHeader.split(',').map((value) => value.trim());
- const filteredValues = values.filter((value) => value !== 'msw/passthrough');
+ const values = acceptHeader.split(',').map((value) => value.trim())
+ const filteredValues = values.filter(
+ (value) => value !== 'msw/passthrough',
+ )
if (filteredValues.length > 0) {
- headers.set('accept', filteredValues.join(', '));
+ headers.set('accept', filteredValues.join(', '))
} else {
- headers.delete('accept');
+ headers.delete('accept')
}
}
- return fetch(requestClone, { headers });
+ return fetch(requestClone, { headers })
}
// Bypass mocking when the client is not active.
if (!client) {
- return passthrough();
+ return passthrough()
}
// Bypass initial page load requests (i.e. static assets).
@@ -238,11 +248,11 @@ async function getResponse(event, client, requestId, requestInterceptedAt) {
// means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
// and is not ready to handle requests.
if (!activeClientIds.has(client.id)) {
- return passthrough();
+ return passthrough()
}
// Notify the client that a request has been intercepted.
- const serializedRequest = await serializeRequest(event.request);
+ const serializedRequest = await serializeRequest(event.request)
const clientMessage = await sendToClient(
client,
{
@@ -253,20 +263,20 @@ async function getResponse(event, client, requestId, requestInterceptedAt) {
...serializedRequest,
},
},
- [serializedRequest.body]
- );
+ [serializedRequest.body],
+ )
switch (clientMessage.type) {
case 'MOCK_RESPONSE': {
- return respondWithMock(clientMessage.data);
+ return respondWithMock(clientMessage.data)
}
case 'PASSTHROUGH': {
- return passthrough();
+ return passthrough()
}
}
- return passthrough();
+ return passthrough()
}
/**
@@ -277,18 +287,21 @@ async function getResponse(event, client, requestId, requestInterceptedAt) {
*/
function sendToClient(client, message, transferrables = []) {
return new Promise((resolve, reject) => {
- const channel = new MessageChannel();
+ const channel = new MessageChannel()
channel.port1.onmessage = (event) => {
if (event.data && event.data.error) {
- return reject(event.data.error);
+ return reject(event.data.error)
}
- resolve(event.data);
- };
+ resolve(event.data)
+ }
- client.postMessage(message, [channel.port2, ...transferrables.filter(Boolean)]);
- });
+ client.postMessage(message, [
+ channel.port2,
+ ...transferrables.filter(Boolean),
+ ])
+ })
}
/**
@@ -301,17 +314,17 @@ function respondWithMock(response) {
// instance will have status code set to 0. Since it's not possible to create
// a Response instance with status code 0, handle that use-case separately.
if (response.status === 0) {
- return Response.error();
+ return Response.error()
}
- const mockedResponse = new Response(response.body, response);
+ const mockedResponse = new Response(response.body, response)
Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
value: true,
enumerable: true,
- });
+ })
- return mockedResponse;
+ return mockedResponse
}
/**
@@ -332,5 +345,5 @@ async function serializeRequest(request) {
referrerPolicy: request.referrerPolicy,
body: await request.arrayBuffer(),
keepalive: request.keepalive,
- };
+ }
}
diff --git a/frontend/src/app/[locale]/(authenticated)/layout.tsx b/frontend/src/app/[locale]/(authenticated)/layout.tsx
index a84ff59..c073b31 100644
--- a/frontend/src/app/[locale]/(authenticated)/layout.tsx
+++ b/frontend/src/app/[locale]/(authenticated)/layout.tsx
@@ -10,7 +10,7 @@ import { Footer } from '@/components/layout/Footer';
export const metadata: Metadata = {
title: {
- template: '%s | PragmaStack',
+ template: '%s | Syndarix',
default: 'Dashboard',
},
};
diff --git a/frontend/src/app/[locale]/admin/layout.tsx b/frontend/src/app/[locale]/admin/layout.tsx
index 0de3d99..99a97f0 100644
--- a/frontend/src/app/[locale]/admin/layout.tsx
+++ b/frontend/src/app/[locale]/admin/layout.tsx
@@ -12,7 +12,7 @@ import { AdminSidebar, Breadcrumbs } from '@/components/admin';
export const metadata: Metadata = {
title: {
- template: '%s | Admin | PragmaStack',
+ template: '%s | Admin | Syndarix',
default: 'Admin Dashboard',
},
};
diff --git a/frontend/src/app/[locale]/demos/page.tsx b/frontend/src/app/[locale]/demos/page.tsx
index cece6a3..bf26742 100644
--- a/frontend/src/app/[locale]/demos/page.tsx
+++ b/frontend/src/app/[locale]/demos/page.tsx
@@ -26,8 +26,8 @@ import { Badge } from '@/components/ui/badge';
import { Separator } from '@/components/ui/separator';
export const metadata: Metadata = {
- title: 'Demo Tour | PragmaStack',
- description: 'Try all features with demo credentials - comprehensive guide to the PragmaStack',
+ title: 'Demo Tour | Syndarix',
+ description: 'Try all features with demo credentials - comprehensive guide to the Syndarix',
};
const demoCategories = [
diff --git a/frontend/src/app/[locale]/dev/docs/page.tsx b/frontend/src/app/[locale]/dev/docs/page.tsx
index 391fde4..18a7aee 100644
--- a/frontend/src/app/[locale]/dev/docs/page.tsx
+++ b/frontend/src/app/[locale]/dev/docs/page.tsx
@@ -120,7 +120,7 @@ export default function DocsHub() {
Design System Documentation
Comprehensive guides, best practices, and references for building consistent,
- accessible, and maintainable user interfaces with the PragmaStack design system.
+ accessible, and maintainable user interfaces with the Syndarix design system.
diff --git a/frontend/src/app/[locale]/dev/page.tsx b/frontend/src/app/[locale]/dev/page.tsx
index a171cb9..cf1f49c 100644
--- a/frontend/src/app/[locale]/dev/page.tsx
+++ b/frontend/src/app/[locale]/dev/page.tsx
@@ -14,7 +14,7 @@ import { Badge } from '@/components/ui/badge';
import { Separator } from '@/components/ui/separator';
export const metadata: Metadata = {
- title: 'Design System Hub | PragmaStack',
+ title: 'Design System Hub | Syndarix',
description:
'Interactive design system demonstrations with live examples - explore components, layouts, spacing, and forms built with shadcn/ui and Tailwind CSS',
};
@@ -90,7 +90,7 @@ export default function DesignSystemHub() {
Interactive demonstrations, live examples, and comprehensive documentation for the
- PragmaStack design system. Built with shadcn/ui + Tailwind CSS 4.
+ Syndarix design system. Built with shadcn/ui + Tailwind CSS 4.
diff --git a/frontend/src/app/[locale]/page.tsx b/frontend/src/app/[locale]/page.tsx
index 49d56c6..7b4e446 100755
--- a/frontend/src/app/[locale]/page.tsx
+++ b/frontend/src/app/[locale]/page.tsx
@@ -1,7 +1,7 @@
/* istanbul ignore file -- @preserve Landing page with complex interactions tested via E2E */
/**
* Homepage / Landing Page
- * Main landing page for the PragmaStack project
+ * Main landing page for the Syndarix project
* Showcases features, tech stack, and provides demos for developers
*/
@@ -68,7 +68,7 @@ export default function Home() {