├── .github
├── images
│ ├── Tailwind_CSS_Logo.svg.png
│ ├── alpine-icon.png
│ ├── astro-icon.png
│ ├── gsap.png
│ ├── image.png
│ ├── pagespeed-small.png
│ ├── screenshot.png
│ └── tailwind-icon.png
└── workflows
│ ├── .gitkeep
│ └── unlighthouse.yml
├── .gitignore
├── .npmrc
├── .vscode
├── extensions.json
├── launch.json
├── settings.json
└── tailwind.json
├── README.md
├── astro.config.mjs
├── bun.lock
├── bunfig.toml
├── cspell.config.yaml
├── package.json
├── public
├── apple-touch-icon-180x180.png
├── favicon.ico
├── favicon.svg
├── fonts
│ └── Satoshi-Variable.woff2
├── logo.svg
├── manifest.webmanifest
├── maskable-icon-512x512.png
├── maskable-icon.png
├── projects
│ ├── astroagency
│ │ └── astroagency.webm
│ ├── astros
│ │ └── astros.webm
│ ├── astroshop
│ │ └── astroshop.webm
│ ├── comingsoon
│ │ └── comingsoon.webm
│ ├── dreamteam
│ │ └── dreamteam-landingpage.webm
│ └── flexfolio
│ │ └── flexfolio.webm
├── pwa-192x192.png
├── pwa-512x512.png
├── pwa-64x64.png
└── robots.txt
├── src
├── assets
│ └── images
│ │ ├── authors
│ │ └── charlie-foster.png
│ │ ├── blog
│ │ ├── ai-webdev-2024.jpg
│ │ ├── edge-computing-2024.jpg
│ │ ├── mobile-development-trends-2024.jpg
│ │ └── web-development-trends-2024.jpg
│ │ ├── global
│ │ ├── logo.svg
│ │ └── logoFull.svg
│ │ ├── projects
│ │ ├── dreamteamdesign.png
│ │ └── yourProject.png
│ │ └── services
│ │ ├── advertising.svg
│ │ ├── creative-designer-doing-multitasking.svg
│ │ ├── mobile-app-ui-ux-design.svg
│ │ ├── seo-link-building.svg
│ │ └── website-ui-ux-development.svg
├── components
│ ├── BaseHead.astro
│ ├── blog
│ │ ├── Articles.astro
│ │ ├── Author.astro
│ │ ├── Authors.astro
│ │ ├── Comments.astro
│ │ ├── Cta.astro
│ │ ├── Entry.astro
│ │ ├── Newsletter.astro
│ │ ├── Tag.astro
│ │ └── Tags.astro
│ ├── forms
│ │ └── Contact.astro
│ ├── global
│ │ ├── BackgroundLines.astro
│ │ ├── BlobAnimation.astro
│ │ ├── Footer.astro
│ │ ├── GrainyGradient.astro
│ │ ├── LinkBlend.astro
│ │ ├── Navigation.astro
│ │ └── Title.astro
│ ├── infopages
│ │ ├── Error404.astro
│ │ ├── Faq.astro
│ │ ├── Privacy.astro
│ │ ├── Terms.astro
│ │ └── ThankYou.astro
│ ├── landing
│ │ ├── AllInOne.astro
│ │ ├── Cta.astro
│ │ ├── Description.astro
│ │ ├── Facts.astro
│ │ ├── Faq.astro
│ │ ├── Hero.astro
│ │ ├── Services.astro
│ │ ├── Tagline.astro
│ │ ├── Testimonials.astro
│ │ └── WorkPreview.astro
│ ├── services
│ │ └── ServicesMain.astro
│ └── work
│ │ ├── CaseStudy.astro
│ │ └── WokCard.astro
├── content
│ ├── authors
│ │ ├── en
│ │ │ └── charlie-foster.md
│ │ └── it
│ │ │ └── charlie-foster.md
│ ├── config.ts
│ ├── posts
│ │ ├── en
│ │ │ ├── ai-webdev-2024.mdx
│ │ │ ├── edge-computing-2025.mdx
│ │ │ ├── game-changing-mobile-development-trends-in-2025.mdx
│ │ │ └── web-development-trends-2025.mdx
│ │ └── it
│ │ │ ├── ai-webdev-2024.mdx
│ │ │ ├── edge-computing-2024.mdx
│ │ │ ├── game-changing-mobile-development-trends-in-2024.mdx
│ │ │ └── web-development-trends-2024.mdx
│ └── projects
│ │ ├── en
│ │ ├── astroagency.mdx
│ │ ├── astros.mdx
│ │ ├── comingsoon.1.mdx
│ │ ├── comingsoon.mdx
│ │ └── flexfolio.mdx
│ │ └── it
│ │ ├── astroagency.mdx
│ │ ├── astros.mdx
│ │ ├── comingsoon.1.mdx
│ │ ├── comingsoon.mdx
│ │ └── flexfolio.mdx
├── env.d.ts
├── i18n
│ ├── ui.ts
│ └── utils.ts
├── layouts
│ ├── BaseLayout.astro
│ └── MarkdownPostLayout.astro
├── pages
│ ├── 404.astro
│ ├── author
│ │ ├── [author].astro
│ │ └── index.astro
│ ├── blog
│ │ ├── [...slug].astro
│ │ └── index.astro
│ ├── contact.astro
│ ├── index.astro
│ ├── it
│ │ ├── 404.astro
│ │ ├── author
│ │ │ ├── [author].astro
│ │ │ └── index.astro
│ │ ├── blog
│ │ │ ├── [...slug].astro
│ │ │ └── index.astro
│ │ ├── contact.astro
│ │ ├── index.astro
│ │ ├── privacy.astro
│ │ ├── services
│ │ │ └── index.astro
│ │ ├── tags
│ │ │ ├── [tag].astro
│ │ │ └── index.astro
│ │ ├── terms.astro
│ │ ├── thank-you.astro
│ │ └── work
│ │ │ └── [...slug].astro
│ ├── privacy.astro
│ ├── rss.xml.ts
│ ├── services
│ │ └── index.astro
│ ├── tags
│ │ ├── [tag].astro
│ │ └── index.astro
│ ├── terms.astro
│ ├── thank-you.astro
│ └── work
│ │ └── [...slug].astro
└── styles
│ └── global.css
├── tailwind.config.cjs
├── tsconfig.json
└── unlighthouse.config.ts
/.github/images/Tailwind_CSS_Logo.svg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/Tailwind_CSS_Logo.svg.png
--------------------------------------------------------------------------------
/.github/images/alpine-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/alpine-icon.png
--------------------------------------------------------------------------------
/.github/images/astro-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/astro-icon.png
--------------------------------------------------------------------------------
/.github/images/gsap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/gsap.png
--------------------------------------------------------------------------------
/.github/images/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/image.png
--------------------------------------------------------------------------------
/.github/images/pagespeed-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/pagespeed-small.png
--------------------------------------------------------------------------------
/.github/images/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/screenshot.png
--------------------------------------------------------------------------------
/.github/images/tailwind-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/images/tailwind-icon.png
--------------------------------------------------------------------------------
/.github/workflows/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/.github/workflows/.gitkeep
--------------------------------------------------------------------------------
/.github/workflows/unlighthouse.yml:
--------------------------------------------------------------------------------
1 | name: Assertions and static report
2 |
3 | on:
4 | workflow_dispatch:
5 | push:
6 | branches:
7 | - main
8 |
9 | env:
10 | PRIVJS_TOKEN: ${{ secrets.PRIVJS_TOKEN }}
11 |
12 | jobs:
13 | test-and-deploy:
14 | runs-on: ubuntu-latest
15 | timeout-minutes: 10
16 | steps:
17 | - uses: actions/checkout@v3
18 |
19 | - uses: oven-sh/setup-bun@v1
20 | with:
21 | bun-version: latest
22 |
23 | - name: Install dependencies
24 | run: bun install
25 |
26 | - name: Install Global dependencies
27 | run: bun install -g netlify-cli @unlighthouse/cli puppeteer
28 |
29 | - name: Unlighthouse assertions and client
30 | run: unlighthouse-ci
31 |
32 | - name: Deploy
33 | run: netlify deploy --dir=.unlighthouse --prod --message="New Release Deploy from GitHub Actions"
34 | env:
35 | NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
36 | NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
37 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # build output
2 | dist/
3 |
4 | # dependencies
5 | node_modules/
6 |
7 | # logs
8 | npm-debug.log*
9 | yarn-debug.log*
10 | yarn-error.log*
11 | pnpm-debug.log*
12 |
13 |
14 | # environment variables
15 | .env
16 | .env.production
17 |
18 | # macOS-specific files
19 | .DS_Store
20 |
21 | .astro
22 |
23 | .unlighthouse
24 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | always-auth=true
2 | //npm.greensock.com/:_authToken=${GSAP_TOKEN}
3 | @gsap:registry=https://npm.greensock.com
4 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "astro-build.astro-vscode",
4 | "bradlc.vscode-tailwindcss",
5 | "christian-kohler.path-intellisense",
6 | "adrianwilczynski.alpine-js-intellisense"
7 | ],
8 | "unwantedRecommendations": []
9 | }
10 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "command": "call .\\node_modules\\.bin\\astro dev",
6 | "name": "server",
7 | "request": "launch",
8 | "type": "node-terminal",
9 | "internalConsoleOptions": "neverOpen"
10 | },
11 | {
12 | "type": "chrome",
13 | "request": "launch",
14 | "name": "client",
15 | "url": "http://localhost:4321",
16 | "webRoot": "${workspaceFolder}/src",
17 | "sourceMapPathOverrides": {
18 | "vite:///src/*": "${webRoot}/*"
19 | },
20 | "skipFiles": [
21 | "**/node_modules/**"
22 | ]
23 | }
24 | ],
25 | "compounds": [
26 | {
27 | "name": "Debug Server and Client",
28 | "configurations": [
29 | "server",
30 | "client"
31 | ]
32 | }
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "css.customData": [".vscode/tailwind.json"]
3 | }
4 |
--------------------------------------------------------------------------------
/.vscode/tailwind.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1.1,
3 | "atDirectives": [
4 | {
5 | "name": "@tailwind",
6 | "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.",
7 | "references": [
8 | {
9 | "name": "Tailwind Documentation",
10 | "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind"
11 | }
12 | ]
13 | },
14 | {
15 | "name": "@apply",
16 | "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.",
17 | "references": [
18 | {
19 | "name": "Tailwind Documentation",
20 | "url": "https://tailwindcss.com/docs/functions-and-directives#apply"
21 | }
22 | ]
23 | },
24 | {
25 | "name": "@responsive",
26 | "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n",
27 | "references": [
28 | {
29 | "name": "Tailwind Documentation",
30 | "url": "https://tailwindcss.com/docs/functions-and-directives#responsive"
31 | }
32 | ]
33 | },
34 | {
35 | "name": "@screen",
36 | "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n",
37 | "references": [
38 | {
39 | "name": "Tailwind Documentation",
40 | "url": "https://tailwindcss.com/docs/functions-and-directives#screen"
41 | }
42 | ]
43 | },
44 | {
45 | "name": "@variants",
46 | "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n",
47 | "references": [
48 | {
49 | "name": "Tailwind Documentation",
50 | "url": "https://tailwindcss.com/docs/functions-and-directives#variants"
51 | }
52 | ]
53 | }
54 | ]
55 | }
56 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [Fomalhaut](https://fomalhaut.majestico.co)
2 |
3 | > [!IMPORTANT]
4 | > Currently this theme only works with the premium version of GSAP, the steps to use the standard version will be available in the future.
5 |
6 | This theme takes inspiration from the Framer theme [formstudio](https://formstudio.site/)
7 |
8 | Instruction to change the main title animation will be available in the future.
9 |
10 | 
11 | 
12 | 
13 |
14 | Fomalhaut is a template made with [Astro](https://astro.build), [Tailwind](https://tailwindcss.com/) and [Gsap](https://gsap.com/)
15 |
16 | [](https://deploy.workers.cloudflare.com/?url=https://github.com/majesticooss/fomalhaut)
17 |
18 | [](https://app.netlify.com/start/deploy?repository=https://github.com/majesticooss/fomalhaut)
19 |
20 | [](https://vercel.com/new/clone?repository-url=https://github.com/majesticooss/fomalhaut)
21 |
22 |
23 | ### [🧪 Site preview →](https://fomalhaut.majestico.co)
24 |
25 | ### [🧑🚀 Astro website →](https://astro.build/)
26 |
27 | ### [🕮 Astro docs →](https://docs.astro.build/en/getting-started/)
28 |
29 | ---
30 |
31 | ## Preview
32 |
33 | 
34 |
35 | ## 🧪 Test
36 |
37 | On the folder run
38 |
39 | 1. `bun install` (or `yarn` or `pnpm i`)
40 | 2. `bun run dev` (or `yarn dev` or `pnpm dev`)
41 |
42 | ## ✅ Features
43 |
44 | - [x] Localization
45 | - [x] Blog
46 |
47 | ---
48 |
49 |
majestico.co
50 |
--------------------------------------------------------------------------------
/astro.config.mjs:
--------------------------------------------------------------------------------
1 | import mdx from "@astrojs/mdx";
2 | import sitemap from "@astrojs/sitemap";
3 | import tailwind from "@astrojs/tailwind";
4 | import icon from "astro-icon";
5 | import { defineConfig } from "astro/config";
6 |
7 | // https://astro.build/config
8 | export default defineConfig({
9 | vite: {
10 | server: {
11 | watch: {
12 | usePolling: true,
13 | },
14 | },
15 | },
16 | site: "https://majestico.co",
17 | i18n: {
18 | defaultLocale: "en",
19 | locales: ["en", "it"],
20 | },
21 | markdown: {
22 | drafts: true,
23 | shikiConfig: {
24 | theme: "css-variables",
25 | },
26 | },
27 | shikiConfig: {
28 | wrap: true,
29 | skipInline: false,
30 | drafts: true,
31 | },
32 | integrations: [
33 | tailwind({
34 | applyBaseStyles: false,
35 | }),
36 | sitemap(),
37 | mdx(),
38 | icon(),
39 | ],
40 | });
41 |
--------------------------------------------------------------------------------
/bunfig.toml:
--------------------------------------------------------------------------------
1 | [install]
2 | # Set default registry
3 | registry = "https://registry.npmjs.org"
4 |
5 | # Configure private registry scoped to a particular organization
6 | [install.scopes]
7 | "@gsap" = { url = "https://npm.greensock.com", token = "$GSAP_TOKEN" }
8 |
--------------------------------------------------------------------------------
/cspell.config.yaml:
--------------------------------------------------------------------------------
1 | version: "0.2"
2 | language: en
3 | dictionaries:
4 | - css
5 | - html
6 | - typescript
7 | enableFiletypes:
8 | - ignore
9 | - properties
10 | - astro
11 | - xml
12 | files:
13 | - "**/.*"
14 | - "**/*.{astro,css,js,json,jsonc,html,md,scss,svelte,svg,yaml,yml,xml}"
15 | useGitignore: true
16 | ignorePaths:
17 | - pnpm-lock.yaml
18 | - data/**/*.json
19 | - dist/**
20 | words:
21 | - astrolib
22 | - logoclouds
23 | - majestico
24 | - Satoshi
25 | - squircle
26 | overrides:
27 | - language: en-gb
28 | filename: "**/*.md"
29 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@majesticostudio/majestico.co",
3 | "type": "module",
4 | "version": "0.0.1",
5 | "private": true,
6 | "description": "majestico.co website",
7 | "repository": {
8 | "type": "git",
9 | "url": "https://github.com/majesticostudio/majestico.co.git"
10 | },
11 | "bugs": "https://github.com/majesticostudio/majestico.co/issues",
12 | "homepage": "https://majestico.co",
13 | "files": [
14 | "*"
15 | ],
16 | "scripts": {
17 | "dev": "astro dev",
18 | "start": "astro dev",
19 | "build": "astro build",
20 | "preview": "astro preview",
21 | "astro": "astro",
22 | "pwa:generate-assets": "pwa-assets-generator --preset minimal public/logo.svg"
23 | },
24 | "dependencies": {
25 | "@astrojs/mdx": "4.0.8",
26 | "@astrojs/rss": "4.0.11",
27 | "@astrojs/sitemap": "3.2.1",
28 | "@astrojs/tailwind": "6.0.0",
29 | "astro": "5.3.0",
30 | "gsap": "npm:@gsap/business@3.12.5",
31 | "tailwindcss": "3.4.3"
32 | },
33 | "devDependencies": {
34 | "@astrolib/seo": "1.0.0-beta.8",
35 | "@cloudflare/workers-types": "4.20250214.0",
36 | "@iconify-json/ic": "1.2.2",
37 | "@iconify-json/iconamoon": "1.2.2",
38 | "@iconify-json/octicon": "1.2.5",
39 | "@tailwindcss/aspect-ratio": "0.4.2",
40 | "@tailwindcss/forms": "0.5.10",
41 | "@tailwindcss/typography": "0.5.16",
42 | "@vite-pwa/assets-generator": "0.2.6",
43 | "astro-icon": "1.1.5",
44 | "prettier": "3.5.2",
45 | "prettier-plugin-astro": "0.14.1",
46 | "prettier-plugin-tailwindcss": "0.6.11",
47 | "unlighthouse": "0.15.0"
48 | },
49 | "prettier": {
50 | "tabWidth": 4,
51 | "useTabs": true,
52 | "bracketSameLine": true,
53 | "printWidth": 150,
54 | "htmlWhitespaceSensitivity": "ignore",
55 | "plugins": [
56 | "prettier-plugin-astro",
57 | "prettier-plugin-tailwindcss"
58 | ]
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/public/apple-touch-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/apple-touch-icon-180x180.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/favicon.ico
--------------------------------------------------------------------------------
/public/favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
8 |
9 |
16 |
23 |
24 |
--------------------------------------------------------------------------------
/public/fonts/Satoshi-Variable.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/fonts/Satoshi-Variable.woff2
--------------------------------------------------------------------------------
/public/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
8 |
9 |
16 |
23 |
24 |
--------------------------------------------------------------------------------
/public/manifest.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "theme_color": "#000000",
3 | "background_color": "#ffffff",
4 | "display": "standalone",
5 | "scope": "/",
6 | "start_url": "/",
7 | "description": "Web Agency Leading in Performant Web Design Solutions - Majestico Studio",
8 | "name": "Majestico",
9 | "short_name": "Majestico",
10 | "icons": [
11 | {
12 | "src": "/pwa-64x64.png",
13 | "sizes": "64x64",
14 | "type": "image/png"
15 | },
16 | {
17 | "src": "/pwa-192x192.png",
18 | "sizes": "192x192",
19 | "type": "image/png"
20 | },
21 | {
22 | "src": "/pwa-512x512.png",
23 | "sizes": "512x512",
24 | "type": "image/png"
25 | }
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/public/maskable-icon-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/maskable-icon-512x512.png
--------------------------------------------------------------------------------
/public/maskable-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/maskable-icon.png
--------------------------------------------------------------------------------
/public/projects/astroagency/astroagency.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/projects/astroagency/astroagency.webm
--------------------------------------------------------------------------------
/public/projects/astros/astros.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/projects/astros/astros.webm
--------------------------------------------------------------------------------
/public/projects/astroshop/astroshop.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/projects/astroshop/astroshop.webm
--------------------------------------------------------------------------------
/public/projects/comingsoon/comingsoon.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/projects/comingsoon/comingsoon.webm
--------------------------------------------------------------------------------
/public/projects/dreamteam/dreamteam-landingpage.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/projects/dreamteam/dreamteam-landingpage.webm
--------------------------------------------------------------------------------
/public/projects/flexfolio/flexfolio.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/projects/flexfolio/flexfolio.webm
--------------------------------------------------------------------------------
/public/pwa-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/pwa-192x192.png
--------------------------------------------------------------------------------
/public/pwa-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/pwa-512x512.png
--------------------------------------------------------------------------------
/public/pwa-64x64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/public/pwa-64x64.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Allow: /
3 |
4 | Sitemap: https://majestico.co/sitemap-index.xml
5 |
--------------------------------------------------------------------------------
/src/assets/images/authors/charlie-foster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/authors/charlie-foster.png
--------------------------------------------------------------------------------
/src/assets/images/blog/ai-webdev-2024.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/blog/ai-webdev-2024.jpg
--------------------------------------------------------------------------------
/src/assets/images/blog/edge-computing-2024.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/blog/edge-computing-2024.jpg
--------------------------------------------------------------------------------
/src/assets/images/blog/mobile-development-trends-2024.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/blog/mobile-development-trends-2024.jpg
--------------------------------------------------------------------------------
/src/assets/images/blog/web-development-trends-2024.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/blog/web-development-trends-2024.jpg
--------------------------------------------------------------------------------
/src/assets/images/global/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
11 |
17 |
18 |
--------------------------------------------------------------------------------
/src/assets/images/global/logoFull.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
8 |
14 |
20 |
21 |
29 |
33 |
37 |
42 |
47 |
49 |
52 |
56 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/src/assets/images/projects/dreamteamdesign.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/projects/dreamteamdesign.png
--------------------------------------------------------------------------------
/src/assets/images/projects/yourProject.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/majesticooss/fomalhaut/8248fdbf602ad27c013655f5b34d242596f031b3/src/assets/images/projects/yourProject.png
--------------------------------------------------------------------------------
/src/components/BaseHead.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { AstroSeo, type AstroSeoProps } from "@astrolib/seo";
3 | import "../styles/global.css";
4 |
5 | type Props = {
6 | seo?: AstroSeoProps;
7 | };
8 |
9 | const { seo } = Astro.props;
10 | ---
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
59 |
--------------------------------------------------------------------------------
/src/components/blog/Articles.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import EntriesOne from "@/components/blog/Entry.astro";
4 | import Title from "@components/global/Title.astro";
5 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
6 |
7 | const lang = getLangFromUrl(Astro.url);
8 | const t = useTranslations(lang);
9 | const translatePath = useTranslatedPath(lang);
10 |
11 | const allPosts = (await getCollection("posts"))
12 | .filter((post) => {
13 | const [postLang, ...slug] = post.slug.split("/");
14 | return postLang === lang;
15 | })
16 | .map((post) => {
17 | const [postLang, slug] = post.slug.split("/");
18 |
19 | return {
20 | ...post,
21 | slug: slug,
22 | };
23 | })
24 | .sort((a, b) => Number(b.data.pubDate) - Number(a.data.pubDate));
25 | ---
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | {
38 | allPosts && allPosts[0] && (
39 |
48 | )
49 | }
50 |
51 |
52 | {
53 | allPosts
54 | .slice(1)
55 | .map((post) => (
56 |
65 | ))
66 | }
67 |
68 |
69 |
70 |
71 |
72 |
79 |
--------------------------------------------------------------------------------
/src/components/blog/Author.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "@components/global/Title.astro";
3 |
4 | const { author } = Astro.props;
5 | ---
6 |
7 |
14 |
--------------------------------------------------------------------------------
/src/components/blog/Authors.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import { Icon } from "astro-icon/components";
4 | import Title from "@components/global/Title.astro";
5 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
6 |
7 | const lang = getLangFromUrl(Astro.url);
8 | const t = useTranslations(lang);
9 | const translatePath = useTranslatedPath(lang);
10 |
11 | const allAuthors = (await getCollection("authors"))
12 | .filter((author) => {
13 | const [authorLang, ...slug] = author.slug.split("/");
14 | return authorLang === lang;
15 | })
16 | .map((author) => {
17 | const [authorLang, slug] = author.slug.split("/");
18 |
19 | return {
20 | ...author,
21 | slug: slug,
22 | };
23 | });
24 | ---
25 |
26 |
49 |
--------------------------------------------------------------------------------
/src/components/blog/Comments.astro:
--------------------------------------------------------------------------------
1 | ---
2 | /* Generate Giscus from
3 | * https://giscus.app/
4 | * you only need to change the following fields:
5 | * dataset.repo="XXX"
6 | * dataset.repoId="XXX"
7 | * dataset.category="XXX"
8 | * dataset.categoryId="XXX"
9 | **/
10 | ---
11 |
12 |
36 |
37 |
--------------------------------------------------------------------------------
/src/components/blog/Cta.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Newsletter from "@components/blog/Newsletter.astro";
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 |
9 | interface Props {
10 | class?: string;
11 | }
12 |
13 | const { class: className } = Astro.props;
14 | ---
15 |
16 |
17 |
18 |
19 |
{t("newsletter_subscribe")}
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/components/blog/Entry.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 |
9 | const { title, url, author, pubDate, description, image, titleInside = false } = Astro.props;
10 | ---
11 |
12 |
13 |
14 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | {title}
23 |
24 |
25 |
26 | {description}
27 |
28 |
29 |
30 |
31 |
32 | {author.name}
33 |
34 |
·
35 |
36 | {pubDate}
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
62 |
--------------------------------------------------------------------------------
/src/components/blog/Newsletter.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const { class: className } = Astro.props;
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 | ---
9 |
10 |
45 |
46 |
54 |
--------------------------------------------------------------------------------
/src/components/blog/Tag.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { type CollectionEntry } from "astro:content";
3 |
4 | import EntriesOne from "@/components/blog/Entry.astro";
5 | import Title from "@components/global/Title.astro";
6 |
7 | interface Props {
8 | tag: string;
9 | posts: CollectionEntry<"posts">;
10 | }
11 |
12 | const { tag, posts } = Astro.props as Props;
13 | ---
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | {
22 | posts.map((post) => (
23 |
32 | ))
33 | }
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/components/blog/Tags.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import { Icon } from "astro-icon/components";
4 | import Title from "@components/global/Title.astro";
5 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
6 |
7 | const lang = getLangFromUrl(Astro.url);
8 | const t = useTranslations(lang);
9 | const translatePath = useTranslatedPath(lang);
10 |
11 | const allPosts = (await getCollection("posts"))
12 | .filter((post) => {
13 | const [postLang, ...slug] = post.slug.split("/");
14 | return postLang === lang;
15 | })
16 | .map((post) => {
17 | const [postLang, slug] = post.slug.split("/");
18 |
19 | return {
20 | ...post,
21 | slug: slug,
22 | };
23 | })
24 | .sort((a, b) => Number(b.data.pubDate) - Number(a.data.pubDate));
25 |
26 | const tags = [...new Set(allPosts.map((post) => post.data.tags).flat())];
27 | ---
28 |
29 |
52 |
--------------------------------------------------------------------------------
/src/components/forms/Contact.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "@components/global/Title.astro";
3 |
4 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
5 |
6 | const lang = getLangFromUrl(Astro.url);
7 | const t = useTranslations(lang);
8 | const translatePath = useTranslatedPath(lang);
9 | ---
10 |
11 |
51 |
52 |
66 |
--------------------------------------------------------------------------------
/src/components/global/BackgroundLines.astro:
--------------------------------------------------------------------------------
1 |
2 |
3 |
24 |
--------------------------------------------------------------------------------
/src/components/global/BlobAnimation.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const blobAColor = "#EDB74D";
3 | const blobBColor = "#EB6666";
4 | const blobCColor = "#6FB18A";
5 | ---
6 |
7 |
12 |
13 |
135 |
--------------------------------------------------------------------------------
/src/components/global/Footer.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Newsletter from "@components/blog/Newsletter.astro";
3 | import { languages } from "@i18n/ui";
4 | import { getLangFromUrl, getUrlWithoutLang, useTranslatedPath, useTranslations } from "@i18n/utils";
5 | import { Icon } from "astro-icon/components";
6 |
7 | const currentLang = getLangFromUrl(Astro.url);
8 | const path = getUrlWithoutLang(Astro.url);
9 | const t = useTranslations(currentLang);
10 | const translatePath = useTranslatedPath(currentLang);
11 | ---
12 |
13 |
14 |
15 |
16 |
27 |
33 |
36 |
38 |
©2025 Your Company
39 |
40 |
41 | {
42 | Object.entries(languages).map(([lang, label]) => (
43 |
46 | {lang}
47 |
48 | ))
49 | }
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
80 |
--------------------------------------------------------------------------------
/src/components/global/GrainyGradient.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const randomId = Math.random().toString(36).substring(2, 15);
3 | const filterUrlId = `url(#${randomId})`;
4 |
5 | const { colorBg = "#6cf901", colorA = "#EDB74D", colorB = "#EB6666", colorC = "#6FB18A", class: className, ...rest } = Astro.props;
6 | ---
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
22 |
23 |
24 |
25 |
169 |
--------------------------------------------------------------------------------
/src/components/global/LinkBlend.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const { class: className, isButton, ...rest } = Astro.props;
3 | ---
4 |
5 | {
6 | isButton ? (
7 |
8 |
9 |
10 | ) : (
11 |
12 |
13 |
14 | )
15 | }
16 |
17 |
50 |
--------------------------------------------------------------------------------
/src/components/global/Navigation.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import { Icon } from "astro-icon/components";
4 | import { getLangFromUrl, getUrlWithoutLang, useTranslations, useTranslatedPath } from "@i18n/utils";
5 |
6 | const lang = getLangFromUrl(Astro.url);
7 | const path = getUrlWithoutLang(Astro.url);
8 | const t = useTranslations(lang);
9 | const translatePath = useTranslatedPath(lang);
10 |
11 | let pages = [
12 | {
13 | id: "home",
14 | initialTitle: "H",
15 | title: "Home",
16 | class: "home",
17 | url: "/",
18 | },
19 | {
20 | id: "services",
21 | initialTitle: "S",
22 | title: t("services"),
23 | class: "services",
24 | url: "/services",
25 | },
26 | {
27 | id: "blog",
28 | initialTitle: "B",
29 | title: "Blog",
30 | class: "blog",
31 | url: "/blog/",
32 | },
33 | {
34 | id: "contact",
35 | initialTitle: "C",
36 | title: t("contacts"),
37 | class: "contact",
38 | url: "/contact/",
39 | },
40 | ];
41 |
42 | const { pathname } = Astro.url;
43 | ---
44 |
45 |
59 |
60 |
69 |
70 |
155 |
--------------------------------------------------------------------------------
/src/components/global/Title.astro:
--------------------------------------------------------------------------------
1 | ---
2 | interface Props {
3 | title: string;
4 | subtitle: string;
5 | class?: string;
6 | center?: boolean;
7 | }
8 |
9 | const { title, subtitle, class: className, center = true } = Astro.props;
10 | ---
11 |
12 |
20 |
21 |
26 |
--------------------------------------------------------------------------------
/src/components/infopages/Error404.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "../global/Title.astro";
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | 404
12 |
13 |
14 |
15 |
16 |
17 |
Sorry, we couldn't find the page you're looking for.
18 |
28 |
29 |
30 |
31 |
32 |
55 |
--------------------------------------------------------------------------------
/src/components/infopages/Faq.astro:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
13 | frequent questions
14 |
15 | & answers
16 |
17 |
18 |
19 |
20 |
22 | How do I get started with your service?
23 |
24 |
25 | To get started with our service, simply visit our website and sign up
26 | for an account. From there, you can explore our products and services
27 | and choose the ones that best meet your needs.
28 |
29 |
30 |
31 |
32 |
34 | How can I request a quote for my project?
35 |
36 |
37 | Requesting a quote is easy! Just visit our Contact page and provide us
38 | with the details of your project. Our team will review your
39 | requirements and get back to you with a tailored quote.
40 |
41 |
42 |
43 |
44 |
46 | What makes your agency stand out?
47 |
48 |
49 | We combine creative expertise with technical excellence. Our team's
50 | collaborative approach ensures that every project is infused with
51 | innovation, design excellence, and cutting-edge technology.
52 |
53 |
54 |
55 |
56 |
58 | Can you handle both small startups and larger businesses?
59 |
60 |
61 | Absolutely! We have experience working with a diverse range of
62 | clients, from startups to established enterprises. Our solutions are
63 | tailored to fit the unique needs of each project.
64 |
65 |
66 |
67 |
68 |
70 | How long does it take to complete a typical project?
71 |
72 |
73 | The project timeline varies depending on the complexity and scope. We
74 | work closely with our clients to set realistic timelines and
75 | milestones to ensure timely delivery without compromising quality.
76 |
77 |
78 |
79 |
80 |
82 | Do you offer ongoing maintenance and support?
83 |
84 |
85 | Yes, we provide ongoing support and maintenance services to ensure
86 | your digital assets remain up-to-date and secure. Our team is
87 | available to address any concerns and implement updates.
88 |
89 |
90 |
91 |
92 |
94 | How do you ensure my website is responsive on all devices?
95 |
96 |
97 | We follow industry best practices for responsive design, conducting
98 | thorough testing on various devices and screen sizes. This ensures
99 | your website delivers a seamless user experience across platforms.
100 |
101 |
102 |
103 |
104 |
106 | Can you help with SEO and digital marketing strategies?
107 |
108 |
109 | Absolutely! We specialize in SEO optimization and digital marketing
110 | services to enhance your online visibility. Our experts will work with
111 | you to create effective strategies that drive traffic and engagement.
112 |
113 |
114 |
115 |
116 |
118 | What technologies do you specialize in?
119 |
120 |
121 | We specialize in a wide range of technologies including HTML5, CSS3,
122 | JavaScript, React, Node.js, and more. Our team stays updated with the
123 | latest trends to ensure your projects are built using the best tools
124 | available.
125 |
126 |
127 |
128 |
129 |
131 | How do I get started with your agency?
132 |
133 |
134 | Getting started is simple! Reach out to us through our Contact page or
135 | give us a call. We'll discuss your project requirements, goals, and
136 | next steps to kick-start the exciting journey of collaboration.
137 |
138 |
139 |
140 |
141 |
142 |
--------------------------------------------------------------------------------
/src/components/infopages/Privacy.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "@components/global/Title.astro";
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 | ---
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
{t("privacy.wip")}
17 |
{t("privacy.wip.content")}
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/components/infopages/Terms.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "@components/global/Title.astro";
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | All the terms that you agree to when you sign up for a Majestico product.
13 |
14 |
15 |
16 | From everyone at Majestico, thank you for using our products! We build them to help you do your best work. There are millions of
17 | people using Majestico products every day. Because we don't know every one of our customers personally, we have to put in place some
18 | Terms of Service to help keep the ship afloat.
19 |
20 |
21 | When we say “Company”, “we”, “our”, or “us” in this document, we are referring to Majestico, a leading agency in [industry/field]. We
22 | specialize in [brief description of services and products].
23 |
24 |
25 | When we say “Services”, we mean our websites, including [www.majestico.com], and any product created and maintained by Majestico, such
26 | as [list specific services or products].
27 |
28 |
29 | When we say “You” or “your”, we are referring to the people or organizations that own an account with one or more of our Services. Our
30 | products are designed to empower [your target audience] in [specific ways].
31 |
32 |
33 |
WIP.
34 |
35 |
If you have any questions about these Terms, please contact us at [support@majestico.it].
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/src/components/infopages/ThankYou.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "../global/Title.astro";
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 | ---
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | {t("thanks.subtitle")}
17 |
18 |
19 |
20 |
21 |
22 |
{t("thanks.content")}
23 |
32 |
33 |
34 |
35 |
36 |
59 |
--------------------------------------------------------------------------------
/src/components/landing/AllInOne.astro:
--------------------------------------------------------------------------------
1 | ---
2 | const { class: className } = Astro.props;
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
Best thing?
24 |
25 |
26 |
It's all in 1 package
27 |
28 |
29 |
30 |
31 |
32 |
66 |
--------------------------------------------------------------------------------
/src/components/landing/Cta.astro:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Alex Carter, Founder of NexusWeb Solutions.
9 |
10 |
12 | Elevate your digital vision with us. Contact now to start creating the
13 | extraordinary!
14 |
15 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/landing/Description.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getLangFromUrl, useTranslatedPath, useTranslations } from "@i18n/utils";
3 |
4 | const { class: className } = Astro.props;
5 |
6 | const lang = getLangFromUrl(Astro.url);
7 | const t = useTranslations(lang);
8 | const translatePath = useTranslatedPath(lang);
9 | ---
10 |
11 |
12 |
13 |
14 | {t("hero.subtitle")}
15 |
16 |
19 | {t("tagline")}
20 |
21 |
22 |
23 |
24 |
25 |
97 |
--------------------------------------------------------------------------------
/src/components/landing/Facts.astro:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Unmatched Excellence.
10 |
11 |
13 | Unmatched Excellence
14 |
15 |
16 | We are a collective of highly skilled digital product specialists,
17 | each bringing a unique set of talents and expertise to the table.
18 |
19 |
20 | Our team is composed of individuals hailing from diverse backgrounds and
21 | cultures, uniting our strengths to create exceptional digital experiences.
22 |
23 |
24 | With members from all corners of the globe, we thrive on the synergy of
25 | our international collaboration, drawing inspiration and innovation from
26 | a multitude of perspectives.
27 |
28 |
29 |
32 |
33 |
35 | Over 30 Years of Agency Experience
36 |
37 |
38 | With over three years in operation, we've achieved a remarkable
39 | track record, successfully launching projects worldwide.
40 |
41 |
42 |
43 |
45 | 1000+ Content Clients
46 |
47 |
48 | We gauge our triumph by clients who repeatedly choose to
49 | collaborate. More than half of our clients entrust us beyond a
50 | solitary project.
51 |
52 |
53 |
54 |
56 | Facilitated Fundraising of Over $20B
57 |
58 |
59 | Our efforts have contributed to securing over $20 billion in funding
60 | for pleny enterprises.
61 |
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/src/components/landing/Faq.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
3 |
4 | const { class: className } = Astro.props;
5 |
6 | const lang = getLangFromUrl(Astro.url);
7 | const t = useTranslations(lang);
8 | const translatePath = useTranslatedPath(lang);
9 |
10 | const faqs = [
11 | {
12 | question: t("faqs.question1"),
13 | answer: t("faqs.answer1"),
14 | },
15 | {
16 | question: t("faqs.question2"),
17 | answer: t("faqs.answer2"),
18 | },
19 | {
20 | question: t("faqs.question3"),
21 | answer: t("faqs.answer3"),
22 | },
23 | {
24 | question: t("faqs.question4"),
25 | answer: t("faqs.answer4"),
26 | },
27 | {
28 | question: t("faqs.question5"),
29 | answer: t("faqs.answer5"),
30 | },
31 | {
32 | question: t("faqs.question6"),
33 | answer: t("faqs.answer6"),
34 | },
35 | {
36 | question: t("faqs.question7"),
37 | answer: t("faqs.answer7"),
38 | },
39 | {
40 | question: t("faqs.question8"),
41 | answer: t("faqs.answer8"),
42 | },
43 | {
44 | question: t("faqs.question9"),
45 | answer: t("faqs.answer9"),
46 | },
47 | {
48 | question: t("faqs.question10"),
49 | answer: t("faqs.answer10"),
50 | },
51 | ];
52 | ---
53 |
54 |
55 |
56 |
57 |
FAQ
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
70 |
71 |
72 |
73 |
74 |
75 | {
76 | faqs.map(({ question, answer }) => (
77 |
78 |
79 | {question}
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | {answer}
88 |
89 | ))
90 | }
91 |
92 |
93 |
94 |
95 |
{t("faq.otherquestions")}
96 |
106 |
107 |
120 |
121 |
122 |
123 |
124 |
131 |
132 |
133 |
134 |
189 |
190 |
198 |
199 |
257 |
--------------------------------------------------------------------------------
/src/components/landing/Hero.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import LinkBlend from "@components/global/LinkBlend.astro";
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 | ---
9 |
10 |
11 |
12 |
13 |
14 |
Majestico
15 |
16 |
17 |
26 |
27 |
28 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
48 |
49 |
50 |
51 |
52 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
72 |
73 |
74 |
75 |
76 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
116 |
117 |
118 |
119 |
120 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
188 |
189 |
190 |
191 |
192 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
216 |
217 |
218 |
219 |
220 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 | (
252 | {t("hero.scroll")}
253 | )
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
292 |
293 |
337 |
--------------------------------------------------------------------------------
/src/components/landing/Services.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import advertisingSvg from "@assets/images/services/advertising.svg?raw";
4 | import designSvg from "@assets/images/services/creative-designer-doing-multitasking.svg?raw";
5 | import mobileSvg from "@assets/images/services/mobile-app-ui-ux-design.svg?raw";
6 | import seoSvg from "@assets/images/services/seo-link-building.svg?raw";
7 | import websiteSvg from "@assets/images/services/website-ui-ux-development.svg?raw";
8 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
9 |
10 | const lang = getLangFromUrl(Astro.url);
11 | const t = useTranslations(lang);
12 | const translatePath = useTranslatedPath(lang);
13 |
14 | const { class: className } = Astro.props;
15 |
16 | const points = [
17 | {
18 | title: t("websites.title"),
19 | content: t("websites.content"),
20 | image: websiteSvg,
21 | },
22 | {
23 | title: t("apps.title"),
24 | content: t("apps.content"),
25 | image: mobileSvg,
26 | },
27 | {
28 | title: t("uiux.title"),
29 | content: t("uiux.content"),
30 | image: designSvg,
31 | },
32 | {
33 | title: t("seo.title"),
34 | content: t("seo.content"),
35 | image: seoSvg,
36 | },
37 | {
38 | title: t("advertising.title"),
39 | content: t("advertising.content"),
40 | image: advertisingSvg,
41 | },
42 | ];
43 | ---
44 |
45 |
46 |
47 |
{t("services")}
48 |
49 | {points.map(() =>
)}
50 |
51 | {
52 | points.map(({ title, content, image }) => (
53 |
54 |
55 |
56 |
57 |
58 | {title}
59 |
60 |
61 |
62 | ))
63 | }
64 |
65 |
66 |
67 |
135 |
--------------------------------------------------------------------------------
/src/components/landing/Tagline.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
3 |
4 | const { class: className } = Astro.props;
5 |
6 | const lang = getLangFromUrl(Astro.url);
7 | const t = useTranslations(lang);
8 | const translatePath = useTranslatedPath(lang);
9 | ---
10 |
11 |
12 |
13 |
14 |
19 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | {t("tagline")}
33 |
34 |
35 |
36 |
37 |
48 |
49 |
121 |
--------------------------------------------------------------------------------
/src/components/landing/Testimonials.astro:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Alex Carter, Founder of NexusWeb Solutions.
9 |
10 |
12 | "This web agency exceeded my expectations. Their creative prowess and
13 | technical skills transformed our website into a masterpiece. A
14 | remarkable team that delivers results!"
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/components/landing/WorkPreview.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import { getCollection } from "astro:content";
4 | import yourProjectImage from "@assets/images/projects/yourProject.png";
5 | import WokCard from "@components/work/WokCard.astro";
6 | import { getLangFromUrl, useTranslatedPath, useTranslations } from "@i18n/utils";
7 |
8 | const lang = getLangFromUrl(Astro.url);
9 | const t = useTranslations(lang);
10 | const translatePath = useTranslatedPath(lang);
11 |
12 | const { class: className } = Astro.props;
13 |
14 | const steps = [10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 96];
15 |
16 | const randomSteps = (minStep: number, maxStep: number) => {
17 | // Filter the steps array to include only values within the specified range
18 | const filteredSteps = steps.filter((step) => step >= minStep && step <= maxStep);
19 |
20 | // Generate a random index within the range of the filteredSteps array
21 | const randomIndex = Math.floor(Math.random() * filteredSteps.length);
22 |
23 | // Return the step at the random index
24 | return filteredSteps[randomIndex];
25 | };
26 |
27 | const possiblePositions = [
28 | {
29 | column: 1,
30 | row: 1,
31 | translateY: 40,
32 | },
33 | {
34 | column: 3,
35 | row: 2,
36 | translateY: randomSteps(60, 80),
37 | },
38 | {
39 | column: 2,
40 | row: 3,
41 | translateY: randomSteps(40, 80),
42 | },
43 | {
44 | column: 1,
45 | row: 4,
46 | translateY: randomSteps(20, 40),
47 | },
48 | {
49 | column: 3,
50 | row: 5,
51 | translateY: randomSteps(20, 80),
52 | },
53 | {
54 | column: 2,
55 | row: 6,
56 | translateY: randomSteps(60, 96),
57 | },
58 | ];
59 |
60 | const allProjects = (await getCollection("projects"))
61 | .filter((prj) => {
62 | const [postLang, ...slug] = prj.slug.split("/");
63 | return postLang === lang;
64 | })
65 | .map((prj) => {
66 | const [postLang, slug] = prj.slug.split("/");
67 |
68 | return {
69 | ...prj,
70 | slug: slug,
71 | };
72 | })
73 | .sort((a, b) => Number(a.data.order) - Number(b.data.order));
74 | ---
75 |
76 |
77 | {t("projects")}
78 |
79 | {
80 | allProjects.map((project, index) => (
81 |
92 | ))
93 | }
94 |
95 |
96 |
97 |
144 |
--------------------------------------------------------------------------------
/src/components/services/ServicesMain.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "@/components/global/Title.astro";
3 | ---
4 |
5 |
10 |
--------------------------------------------------------------------------------
/src/components/work/CaseStudy.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Title from "@components/global/Title.astro";
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Transforming GreenLeaf Organic Grocers vision into a recognizable brand. We designed a logo that embodies their commitment to
14 | sustainability, and developed comprehensive brand guidelines to maintain a cohesive image across all touchpoints.
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
Client: GreenLeaf Organic Grocers
24 |
Industry: Organic Food Retail
25 |
Challenge: Establishing a Strong Brand Identity to Reflect Sustainability
26 |
27 |
Introduction:
28 |
29 | GreenLeaf Organic Grocers, a prominent player in the organic food retail sector, approached us with a critical need to revamp
30 | their brand identity. They aspired to embody their commitment to sustainability and provide a cohesive brand experience to their
31 | customers.
32 |
33 |
34 |
Solution:
35 |
36 | Our team embarked on a holistic brand transformation journey that aimed to capture GreenLeaf's values and vision. We devised a
37 | comprehensive strategy that involved logo design, visual identity development, and brand guidelines creation.
38 |
39 |
40 |
Logo Design:
41 |
42 | Understanding GreenLeaf's dedication to eco-friendliness, we conceptualized a logo that represented growth, nature, and
43 | sustainability. The logo featured a vibrant leaf intertwined with a circular motif, symbolizing the cycle of nature. The color
44 | palette we selected harmonized earthy tones, evoking a sense of freshness and natural abundance.
45 |
46 |
47 |
48 |
49 |
50 |
Visual Identity:
51 |
52 | To ensure consistency across all touchpoints, we carefully curated a visual identity that reflected GreenLeaf's core values. We
53 | incorporated leaf-inspired patterns, organic textures, and nature-themed imagery. These elements were seamlessly integrated into the
54 | website, packaging, and marketing materials, fostering a strong brand presence.
55 |
56 |
57 |
Brand Guidelines:
58 |
59 | To maintain a unified brand image, we meticulously developed comprehensive brand guidelines. These guidelines encompassed logo usage,
60 | typography choices, color codes, and guidelines for imagery. By providing clear instructions, we empowered GreenLeaf's internal teams
61 | and external partners to consistently represent the brand.
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
Results:
80 |
81 | The transformation was met with resounding success. GreenLeaf Organic Grocers witnessed a significant positive response from both
82 | existing and new customers. The brand's fresh and sustainable image resonated with consumers seeking eco-conscious choices. The new
83 | brand identity also positioned GreenLeaf as a leader in the organic food industry.
84 |
85 |
86 |
Impact:
87 |
88 |
89 | Increased Recognition: The revamped logo and visual elements led to higher brand recognition and recall among
90 | customers.
91 |
92 |
93 | Consistency: The implemented brand guidelines ensured a consistent and coherent brand representation across all
94 | platforms.
95 |
96 |
97 | Customer Engagement: The new brand image connected emotionally with customers who aligned with the sustainability
98 | ethos.
99 |
100 |
101 |
102 |
Conclusion:
103 |
104 | Through the strategic marriage of design and strategy, we successfully transformed GreenLeaf Organic Grocers into a recognizable and
105 | admired brand. The collaboration between our team and GreenLeaf resulted in a brand identity that not only reflects their commitment
106 | to sustainability but also reinforces their position in the organic food market.
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/src/components/work/WokCard.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import { getLangFromUrl, useTranslations, useTranslatedPath } from "@i18n/utils";
4 |
5 | const lang = getLangFromUrl(Astro.url);
6 | const t = useTranslations(lang);
7 | const translatePath = useTranslatedPath(lang);
8 |
9 | const { image, video, project, link, description, class: className } = Astro.props;
10 | ---
11 |
12 |
13 |
14 | {
15 | video != null ? (
16 |
17 | ) : image ? (
18 |
19 | ) : (
20 | {project}
21 | )
22 | }
23 |
24 |
33 |
34 |
35 |
76 |
--------------------------------------------------------------------------------
/src/content/authors/en/charlie-foster.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Charlie Foster
3 | description: "Charlie Foster"
4 | image:
5 | source: "@assets/images/authors/charlie-foster.png"
6 | alt: "#"
7 | ---
8 |
9 |
--------------------------------------------------------------------------------
/src/content/authors/it/charlie-foster.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Charlie Foster
3 | description: "Charlie Foster"
4 | image:
5 | source: "@assets/images/authors/charlie-foster.png"
6 | alt: "#"
7 | ---
8 |
9 |
--------------------------------------------------------------------------------
/src/content/config.ts:
--------------------------------------------------------------------------------
1 | import { defineCollection, z } from "astro:content";
2 |
3 | const postsCollection = defineCollection({
4 | schema: ({ image }) =>
5 | z.object({
6 | title: z.string(),
7 | pubDate: z.date(),
8 | description: z.string(),
9 | link: z.optional(z.string()),
10 | video: z.optional(z.string()),
11 | author: z.object({
12 | name: z.string(),
13 | link: z.string(),
14 | }),
15 | image: z.object({
16 | source: image(),
17 | alt: z.string(),
18 | }),
19 | tags: z.array(z.string()),
20 | }),
21 | });
22 |
23 | const projectsCollection = defineCollection({
24 | schema: ({ image }) =>
25 | z.object({
26 | title: z.string(),
27 | pubDate: z.date(),
28 | description: z.string(),
29 | link: z.string(),
30 | author: z.object({
31 | name: z.string(),
32 | link: z.string(),
33 | }),
34 | order: z.number(),
35 | video: z.optional(z.string()),
36 | image: z.optional(
37 | z.object({
38 | source: image(),
39 | alt: z.string(),
40 | }),
41 | ),
42 | tags: z.optional(z.array(z.string())),
43 | }),
44 | });
45 |
46 | const authorsCollection = defineCollection({
47 | schema: ({ image }) =>
48 | z.object({
49 | name: z.string(),
50 | description: z.string(),
51 | image: z.object({
52 | source: image(),
53 | alt: z.string(),
54 | }),
55 | }),
56 | });
57 |
58 | export const collections = {
59 | posts: postsCollection,
60 | projects: projectsCollection,
61 | authors: authorsCollection,
62 | };
63 |
--------------------------------------------------------------------------------
/src/content/posts/en/ai-webdev-2024.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-02-15
3 | author:
4 | name: Alex Rivera
5 | link: /author/alex-rivera
6 | title: AI-Powered Web Development Trends in 2024
7 | description: "Explore how artificial intelligence is reshaping web development practices in 2024. From AI-assisted coding to intelligent testing, discover the tools and technologies driving the future of web development."
8 | image:
9 | source: "@assets/images/blog/ai-webdev-2024.jpg"
10 | alt: "Abstract visualization of AI neural networks in web development"
11 | tags: ["Artificial Intelligence", "Web Development", "Machine Learning", "Developer Tools", "Automation"]
12 | ---
13 |
14 | Artificial Intelligence is fundamentally changing how developers build and maintain web applications in 2024. From code generation to automated testing, AI tools are becoming an integral part of the modern development workflow.
15 |
16 | ## The AI Development Revolution
17 |
18 | The integration of AI in web development brings transformative capabilities:
19 |
20 | - Intelligent code completion and generation
21 | - Automated bug detection and fixing
22 | - Smart code review and optimization
23 | - Natural language to code conversion
24 | - AI-powered development assistants
25 |
26 | ## Essential AI Development Tools
27 |
28 | Today's AI-powered development landscape includes:
29 |
30 | - GitHub Copilot and similar code assistants
31 | - AI-driven testing frameworks
32 | - Automated code optimization tools
33 | - Machine learning-based security scanning
34 | - Intelligent debugging assistants
35 |
36 | ## Impact Across Development Phases
37 |
38 | AI is enhancing every stage of development:
39 |
40 | - Planning: Smart project estimation and resource allocation
41 | - Design: AI-generated UI/UX suggestions
42 | - Development: Automated code generation and optimization
43 | - Testing: Intelligent test case generation
44 | - Deployment: Smart infrastructure management
45 |
46 | ## Enhanced Developer Productivity
47 |
48 | AI tools are revolutionizing developer workflows:
49 |
50 | - Automated documentation generation
51 | - Intelligent code refactoring
52 | - Smart dependency management
53 | - Automated code review
54 | - Performance optimization suggestions
55 |
56 | ## Real-World Benefits
57 |
58 | Organizations implementing AI-powered development are experiencing:
59 |
60 | - 40% reduction in development time
61 | - 60% decrease in bug detection time
62 | - Improved code quality metrics
63 | - Enhanced developer satisfaction
64 | - Faster project delivery
65 |
66 | ## Security and AI
67 |
68 | AI is transforming security practices through:
69 |
70 | - Automated vulnerability detection
71 | - Intelligent threat monitoring
72 | - Smart access control systems
73 | - Predictive security analysis
74 | - Real-time threat response
75 |
76 | ## Future Perspectives
77 |
78 | As AI continues to evolve, we're witnessing the emergence of even more sophisticated development tools and practices. The combination of machine learning, natural language processing, and traditional development practices is creating a new paradigm for web application creation.
79 |
80 | Join us in exploring this exciting intersection of artificial intelligence and web development that's defining the future of our industry!
81 |
--------------------------------------------------------------------------------
/src/content/posts/en/edge-computing-2025.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-02-15
3 | author:
4 | name: Alex Rivera
5 | link: /author/alex-rivera
6 | title: The Rise of Edge Computing in Modern Web Architecture
7 | description: "Discover how edge computing is transforming web development in 2024. From improved performance to enhanced security, learn why businesses are rapidly adopting edge computing solutions for their web applications."
8 | image:
9 | source: "@assets/images/blog/edge-computing-2024.jpg"
10 | alt: "Digital network visualization representing edge computing infrastructure"
11 | tags: ["Edge Computing", "Web Development", "Cloud Computing", "Performance", "Security"]
12 | ---
13 |
14 | Edge computing is revolutionizing how we build and deploy web applications in 2024. By bringing computation closer to data sources, organizations are achieving unprecedented levels of performance and reliability.
15 |
16 | ## The Evolution of Edge Computing
17 |
18 | The shift from traditional cloud computing to edge architecture brings several advantages:
19 |
20 | - Reduced latency and faster response times
21 | - Lower bandwidth costs
22 | - Enhanced data privacy and security
23 | - Improved reliability and redundancy
24 | - Better support for real-time applications
25 |
26 | ## Key Implementation Strategies
27 |
28 | Modern edge computing implementations focus on:
29 |
30 | - Distributed caching mechanisms
31 | - Edge-native security protocols
32 | - Serverless function deployment
33 | - Content delivery optimization
34 | - Real-time data processing
35 |
36 | ## Industry Applications
37 |
38 | Edge computing is transforming various sectors:
39 |
40 | - E-commerce: Real-time inventory and pricing updates
41 | - Healthcare: Remote patient monitoring
42 | - Gaming: Low-latency multiplayer experiences
43 | - IoT: Efficient device management
44 | - Financial Services: Secure transaction processing
45 |
46 | ## Security Considerations
47 |
48 | Edge computing introduces new security paradigms:
49 |
50 | - Zero-trust architecture implementation
51 | - Edge-specific encryption protocols
52 | - Distributed authentication systems
53 | - Real-time threat detection
54 | - Automated security responses
55 |
56 | ## Performance Benefits
57 |
58 | Organizations implementing edge computing are seeing:
59 |
60 | - 50-70% reduction in latency
61 | - 30-40% decrease in bandwidth costs
62 | - Improved application reliability
63 | - Better user experiences
64 | - Enhanced global scalability
65 |
66 | ## Looking Ahead
67 |
68 | As edge computing continues to mature, we're seeing the emergence of new patterns and practices that will define the future of web architecture. The combination of 5G networks, IoT proliferation, and edge computing is creating a new paradigm for web application development.
69 |
70 | Stay tuned as we continue to explore this exciting technological frontier that's reshaping the web development landscape!
71 |
--------------------------------------------------------------------------------
/src/content/posts/en/game-changing-mobile-development-trends-in-2025.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-02-15
3 | author:
4 | name: Alex Rivera
5 | link: /author/alex-rivera
6 | title: Game-Changing Mobile Development Trends in 2024
7 | description: "Discover the revolutionary mobile development trends transforming app creation in 2024. From cross-platform solutions to emerging technologies, learn what's driving the future of mobile applications."
8 | image:
9 | source: "@assets/images/blog/mobile-development-trends-2024.jpg"
10 | alt: "Abstract visualization of mobile development concepts and technologies"
11 | tags: ["Mobile Development", "Technology", "Innovation", "Cross-Platform", "Mobile Apps"]
12 | ---
13 |
14 | The mobile development ecosystem is experiencing unprecedented transformation in 2024. As smartphones become increasingly powerful, developers are pushing the boundaries of what's possible in mobile applications.
15 |
16 | ## Cross-Platform Development Revolution
17 |
18 | The battle between native and cross-platform development is reaching new heights. Framework innovations are enabling developers to create high-performance apps that truly feel native while maintaining a single codebase. This shift is dramatically reducing development time and costs.
19 |
20 | ## Augmented Reality Takes Center Stage
21 |
22 | AR is no longer confined to gaming and entertainment. Mobile developers are incorporating AR features into:
23 |
24 | - Shopping experiences
25 | - Educational applications
26 | - Navigation systems
27 | - Industrial training tools
28 |
29 | ## Edge Computing Integration
30 |
31 | Edge computing is revolutionizing mobile app performance by bringing processing closer to the user. Benefits include:
32 |
33 | - Reduced latency
34 | - Enhanced privacy
35 | - Better offline functionality
36 | - Improved battery efficiency
37 |
38 | ## Sustainable Development Practices
39 |
40 | Environmental consciousness is influencing mobile development, with focus on:
41 |
42 | - Energy-efficient algorithms
43 | - Sustainable hosting solutions
44 | - Carbon-aware computing
45 | - Optimized battery consumption
46 |
47 | ## Looking Ahead
48 |
49 | The mobile development landscape continues to evolve at breakneck speed. These trends represent the beginning of a new era in mobile computing, where performance, sustainability, and user experience converge to create unprecedented possibilities.
50 |
51 | Stay connected for more updates on the transformative world of mobile development!
52 |
--------------------------------------------------------------------------------
/src/content/posts/en/web-development-trends-2025.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-01-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Web Development Trends in 2024
7 | description: "Exploring the most exciting web development trends that are shaping the digital landscape in 2024. From AI integration to advanced frameworks, discover what's driving innovation in web development."
8 | image:
9 | source: "@assets/images/blog/web-development-trends-2024.jpg"
10 | alt: "Illustration showing various web development technologies and trends"
11 | tags: ["Web Development", "Technology", "Trends", "AI", "Frontend"]
12 | ---
13 |
14 | The web development landscape is constantly evolving, and 2024 brings exciting new possibilities to the forefront. As we navigate through this dynamic field, several key trends are emerging that promise to reshape how we build and interact with web applications.
15 |
16 | ## AI Integration in Web Development
17 |
18 | Artificial Intelligence is no longer just a buzzword – it's becoming an integral part of web development. From AI-powered code completion to intelligent debugging tools, developers are leveraging these technologies to streamline their workflow and create more sophisticated applications.
19 |
20 | ## The Rise of Web Components
21 |
22 | Web Components are gaining significant traction, offering a standardized way to create reusable custom elements. This approach to component-based architecture is making it easier to build maintainable and scalable applications while ensuring better compatibility across different frameworks.
23 |
24 | ## Performance-First Development
25 |
26 | With Core Web Vitals becoming increasingly important for SEO and user experience, developers are placing greater emphasis on performance optimization. This includes:
27 |
28 | - Implementing efficient loading strategies
29 | - Optimizing asset delivery
30 | - Utilizing modern image formats
31 | - Adopting serverless architectures
32 |
33 | ## Enhanced Security Measures
34 |
35 | As cyber threats continue to evolve, security has become a top priority. We're seeing increased adoption of:
36 |
37 | - Zero-trust security models
38 | - Advanced authentication methods
39 | - Real-time threat detection
40 | - Automated security testing
41 |
42 | ## The Future is Exciting
43 |
44 | These trends represent just a fraction of the innovations happening in web development. As we continue through 2024, we'll likely see even more exciting developments that push the boundaries of what's possible on the web.
45 |
46 | Stay tuned for more insights into the ever-evolving world of web development!
47 |
--------------------------------------------------------------------------------
/src/content/posts/it/ai-webdev-2024.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-02-15
3 | author:
4 | name: Alex Rivera
5 | link: /author/alex-rivera
6 | title: AI-Powered Web Development Trends in 2024
7 | description: "Explore how artificial intelligence is reshaping web development practices in 2024. From AI-assisted coding to intelligent testing, discover the tools and technologies driving the future of web development."
8 | image:
9 | source: "@assets/images/blog/ai-webdev-2024.jpg"
10 | alt: "Abstract visualization of AI neural networks in web development"
11 | tags: ["Artificial Intelligence", "Web Development", "Machine Learning", "Developer Tools", "Automation"]
12 | ---
13 |
14 | Artificial Intelligence is fundamentally changing how developers build and maintain web applications in 2024. From code generation to automated testing, AI tools are becoming an integral part of the modern development workflow.
15 |
16 | ## The AI Development Revolution
17 |
18 | The integration of AI in web development brings transformative capabilities:
19 |
20 | - Intelligent code completion and generation
21 | - Automated bug detection and fixing
22 | - Smart code review and optimization
23 | - Natural language to code conversion
24 | - AI-powered development assistants
25 |
26 | ## Essential AI Development Tools
27 |
28 | Today's AI-powered development landscape includes:
29 |
30 | - GitHub Copilot and similar code assistants
31 | - AI-driven testing frameworks
32 | - Automated code optimization tools
33 | - Machine learning-based security scanning
34 | - Intelligent debugging assistants
35 |
36 | ## Impact Across Development Phases
37 |
38 | AI is enhancing every stage of development:
39 |
40 | - Planning: Smart project estimation and resource allocation
41 | - Design: AI-generated UI/UX suggestions
42 | - Development: Automated code generation and optimization
43 | - Testing: Intelligent test case generation
44 | - Deployment: Smart infrastructure management
45 |
46 | ## Enhanced Developer Productivity
47 |
48 | AI tools are revolutionizing developer workflows:
49 |
50 | - Automated documentation generation
51 | - Intelligent code refactoring
52 | - Smart dependency management
53 | - Automated code review
54 | - Performance optimization suggestions
55 |
56 | ## Real-World Benefits
57 |
58 | Organizations implementing AI-powered development are experiencing:
59 |
60 | - 40% reduction in development time
61 | - 60% decrease in bug detection time
62 | - Improved code quality metrics
63 | - Enhanced developer satisfaction
64 | - Faster project delivery
65 |
66 | ## Security and AI
67 |
68 | AI is transforming security practices through:
69 |
70 | - Automated vulnerability detection
71 | - Intelligent threat monitoring
72 | - Smart access control systems
73 | - Predictive security analysis
74 | - Real-time threat response
75 |
76 | ## Future Perspectives
77 |
78 | As AI continues to evolve, we're witnessing the emergence of even more sophisticated development tools and practices. The combination of machine learning, natural language processing, and traditional development practices is creating a new paradigm for web application creation.
79 |
80 | Join us in exploring this exciting intersection of artificial intelligence and web development that's defining the future of our industry!
81 |
--------------------------------------------------------------------------------
/src/content/posts/it/edge-computing-2024.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-02-15
3 | author:
4 | name: Alex Rivera
5 | link: /author/alex-rivera
6 | title: The Rise of Edge Computing in Modern Web Architecture
7 | description: "Discover how edge computing is transforming web development in 2024. From improved performance to enhanced security, learn why businesses are rapidly adopting edge computing solutions for their web applications."
8 | image:
9 | source: "@assets/images/blog/edge-computing-2024.jpg"
10 | alt: "Digital network visualization representing edge computing infrastructure"
11 | tags: ["Edge Computing", "Web Development", "Cloud Computing", "Performance", "Security"]
12 | ---
13 |
14 | Edge computing is revolutionizing how we build and deploy web applications in 2024. By bringing computation closer to data sources, organizations are achieving unprecedented levels of performance and reliability.
15 |
16 | ## The Evolution of Edge Computing
17 |
18 | The shift from traditional cloud computing to edge architecture brings several advantages:
19 |
20 | - Reduced latency and faster response times
21 | - Lower bandwidth costs
22 | - Enhanced data privacy and security
23 | - Improved reliability and redundancy
24 | - Better support for real-time applications
25 |
26 | ## Key Implementation Strategies
27 |
28 | Modern edge computing implementations focus on:
29 |
30 | - Distributed caching mechanisms
31 | - Edge-native security protocols
32 | - Serverless function deployment
33 | - Content delivery optimization
34 | - Real-time data processing
35 |
36 | ## Industry Applications
37 |
38 | Edge computing is transforming various sectors:
39 |
40 | - E-commerce: Real-time inventory and pricing updates
41 | - Healthcare: Remote patient monitoring
42 | - Gaming: Low-latency multiplayer experiences
43 | - IoT: Efficient device management
44 | - Financial Services: Secure transaction processing
45 |
46 | ## Security Considerations
47 |
48 | Edge computing introduces new security paradigms:
49 |
50 | - Zero-trust architecture implementation
51 | - Edge-specific encryption protocols
52 | - Distributed authentication systems
53 | - Real-time threat detection
54 | - Automated security responses
55 |
56 | ## Performance Benefits
57 |
58 | Organizations implementing edge computing are seeing:
59 |
60 | - 50-70% reduction in latency
61 | - 30-40% decrease in bandwidth costs
62 | - Improved application reliability
63 | - Better user experiences
64 | - Enhanced global scalability
65 |
66 | ## Looking Ahead
67 |
68 | As edge computing continues to mature, we're seeing the emergence of new patterns and practices that will define the future of web architecture. The combination of 5G networks, IoT proliferation, and edge computing is creating a new paradigm for web application development.
69 |
70 | Stay tuned as we continue to explore this exciting technological frontier that's reshaping the web development landscape!
71 |
--------------------------------------------------------------------------------
/src/content/posts/it/game-changing-mobile-development-trends-in-2024.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-02-15
3 | author:
4 | name: Alex Rivera
5 | link: /author/alex-rivera
6 | title: Game-Changing Mobile Development Trends in 2024
7 | description: "Discover the revolutionary mobile development trends transforming app creation in 2024. From cross-platform solutions to emerging technologies, learn what's driving the future of mobile applications."
8 | image:
9 | source: "@assets/images/blog/mobile-development-trends-2024.jpg"
10 | alt: "Abstract visualization of mobile development concepts and technologies"
11 | tags: ["Mobile Development", "Technology", "Innovation", "Cross-Platform", "Mobile Apps"]
12 | ---
13 |
14 | The mobile development ecosystem is experiencing unprecedented transformation in 2024. As smartphones become increasingly powerful, developers are pushing the boundaries of what's possible in mobile applications.
15 |
16 | ## Cross-Platform Development Revolution
17 |
18 | The battle between native and cross-platform development is reaching new heights. Framework innovations are enabling developers to create high-performance apps that truly feel native while maintaining a single codebase. This shift is dramatically reducing development time and costs.
19 |
20 | ## Augmented Reality Takes Center Stage
21 |
22 | AR is no longer confined to gaming and entertainment. Mobile developers are incorporating AR features into:
23 |
24 | - Shopping experiences
25 | - Educational applications
26 | - Navigation systems
27 | - Industrial training tools
28 |
29 | ## Edge Computing Integration
30 |
31 | Edge computing is revolutionizing mobile app performance by bringing processing closer to the user. Benefits include:
32 |
33 | - Reduced latency
34 | - Enhanced privacy
35 | - Better offline functionality
36 | - Improved battery efficiency
37 |
38 | ## Sustainable Development Practices
39 |
40 | Environmental consciousness is influencing mobile development, with focus on:
41 |
42 | - Energy-efficient algorithms
43 | - Sustainable hosting solutions
44 | - Carbon-aware computing
45 | - Optimized battery consumption
46 |
47 | ## Looking Ahead
48 |
49 | The mobile development landscape continues to evolve at breakneck speed. These trends represent the beginning of a new era in mobile computing, where performance, sustainability, and user experience converge to create unprecedented possibilities.
50 |
51 | Stay connected for more updates on the transformative world of mobile development!
52 |
--------------------------------------------------------------------------------
/src/content/posts/it/web-development-trends-2024.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2024-01-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Web Development Trends in 2024
7 | description: "Exploring the most exciting web development trends that are shaping the digital landscape in 2024. From AI integration to advanced frameworks, discover what's driving innovation in web development."
8 | image:
9 | source: "@assets/images/blog/web-development-trends-2024.jpg"
10 | alt: "Illustration showing various web development technologies and trends"
11 | tags: ["Web Development", "Technology", "Trends", "AI", "Frontend"]
12 | ---
13 |
14 | The web development landscape is constantly evolving, and 2024 brings exciting new possibilities to the forefront. As we navigate through this dynamic field, several key trends are emerging that promise to reshape how we build and interact with web applications.
15 |
16 | ## AI Integration in Web Development
17 |
18 | Artificial Intelligence is no longer just a buzzword – it's becoming an integral part of web development. From AI-powered code completion to intelligent debugging tools, developers are leveraging these technologies to streamline their workflow and create more sophisticated applications.
19 |
20 | ## The Rise of Web Components
21 |
22 | Web Components are gaining significant traction, offering a standardized way to create reusable custom elements. This approach to component-based architecture is making it easier to build maintainable and scalable applications while ensuring better compatibility across different frameworks.
23 |
24 | ## Performance-First Development
25 |
26 | With Core Web Vitals becoming increasingly important for SEO and user experience, developers are placing greater emphasis on performance optimization. This includes:
27 |
28 | - Implementing efficient loading strategies
29 | - Optimizing asset delivery
30 | - Utilizing modern image formats
31 | - Adopting serverless architectures
32 |
33 | ## Enhanced Security Measures
34 |
35 | As cyber threats continue to evolve, security has become a top priority. We're seeing increased adoption of:
36 |
37 | - Zero-trust security models
38 | - Advanced authentication methods
39 | - Real-time threat detection
40 | - Automated security testing
41 |
42 | ## The Future is Exciting
43 |
44 | These trends represent just a fraction of the innovations happening in web development. As we continue through 2024, we'll likely see even more exciting developments that push the boundaries of what's possible on the web.
45 |
46 | Stay tuned for more insights into the ever-evolving world of web development!
47 |
--------------------------------------------------------------------------------
/src/content/projects/en/astroagency.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Astroagency
7 | description: "Astroagency"
8 | link: "https://astroagency.majestico.co"
9 | video: /projects/astroagency/astroagency.webm
10 | order: 3
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/en/astros.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Astros
7 | description: "Astros"
8 | link: "https://astros.zank.studio"
9 | video: /projects/astros/astros.webm
10 | order: 2
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/en/comingsoon.1.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Coming soon
7 | description: "Coming soon."
8 | link: "#"
9 | video: /projects/comingsoon/comingsoon.webm
10 | order: 7
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/en/comingsoon.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Coming soon
7 | description: "Coming soon."
8 | link: "#"
9 | video: /projects/comingsoon/comingsoon.webm
10 | order: 7
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/en/flexfolio.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Flexfolio
7 | description: "Flexfolio"
8 | link: "https://flexfolio.zank.studio"
9 | video: /projects/flexfolio/flexfolio.webm
10 | order: 4
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/it/astroagency.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Astroagency
7 | description: "Astroagency"
8 | link: "https://astroagency.majestico.co"
9 | video: /projects/astroagency/astroagency.webm
10 | order: 3
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/it/astros.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Astros
7 | description: "Astros"
8 | link: "https://astros.zank.studio"
9 | video: /projects/astros/astros.webm
10 | order: 2
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/it/comingsoon.1.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Coming soon
7 | description: "Coming soon."
8 | link: "#"
9 | video: /projects/comingsoon/comingsoon.webm
10 | order: 7
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/it/comingsoon.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Coming soon
7 | description: "Coming soon."
8 | link: "#"
9 | video: /projects/comingsoon/comingsoon.webm
10 | order: 7
11 | ---
12 |
--------------------------------------------------------------------------------
/src/content/projects/it/flexfolio.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | pubDate: 2023-07-01
3 | author:
4 | name: Charlie Foster
5 | link: /author/charlie-foster
6 | title: Flexfolio
7 | description: "Flexfolio"
8 | link: "https://flexfolio.zank.studio"
9 | video: /projects/flexfolio/flexfolio.webm
10 | order: 4
11 | ---
12 |
--------------------------------------------------------------------------------
/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
--------------------------------------------------------------------------------
/src/i18n/ui.ts:
--------------------------------------------------------------------------------
1 | export const languages = {
2 | en: "English",
3 | it: "Italiano",
4 | };
5 |
6 | export const defaultLang = "en";
7 |
8 | export const ui = {
9 | en: {
10 | or: "or",
11 | contact: "Contact",
12 | contacts: "Contacts",
13 | contactus: "Contact us",
14 | projects: "Projects",
15 | services: "Services",
16 | homepage: "Homepage",
17 | tagline:
18 | "Weaving digital dreams into reality. Where innovation dances with imagination, and every pixel tells a story of boundless creativity.",
19 | "projects.yours": "Your project",
20 | "projects.see": "See project",
21 | "hero.title.main": "We shape",
22 | "hero.title.1": "visions",
23 | "hero.title.2": "dreams",
24 | "hero.title.3": "worlds",
25 | "hero.title.4": "futures",
26 | "hero.subtitle":
27 | "Conjuring digital realms where imagination takes flight and possibilities know no bounds",
28 | "hero.scroll": "scroll down to explore",
29 | "websites.title": "Websites",
30 | "apps.title": "Apps",
31 | "uiux.title": "UI/UX Design",
32 | "seo.title": "SEO",
33 | "advertising.title": "Advertising",
34 | "websites.content":
35 | "Sculpting digital landscapes where dreams take form. Our creations blend artistry with innovation, crafting spaces that inspire and transform.",
36 | "apps.content":
37 | "Forging digital companions that dance at your fingertips. We create tools that feel like magic, yet work like clockwork.",
38 | "uiux.content":
39 | "Painting experiences that feel like second nature. Every interaction is a brushstroke in our canvas of seamless digital journeys.",
40 | "seo.content":
41 | "Charting paths through the digital cosmos. We guide your story to those seeking its light, using data as our compass.",
42 | "advertising.content":
43 | "Crafting digital echoes that resonate across screens and hearts. We turn whispers into conversations that matter.",
44 | "privacy.wip": "Work in progress",
45 | "privacy.wip.content": "This page will be updated soon",
46 | "faqs.question1": "What's your creative process?",
47 | "faqs.answer1":
48 | "Every journey begins with a spark of imagination. We dive deep into your vision, craft prototypes of possibility, and iterate until magic happens.",
49 | "faqs.question2": "How do you approach digital crafting?",
50 | "faqs.answer2":
51 | "Each project is a unique constellation. We typically invest 4-6 weeks breathing life into your vision, with investments ranging from €3000 for digital gardens to €4500 for enchanted marketplaces.",
52 | "faqs.question3": "What about ongoing nurture?",
53 | "faqs.answer3":
54 | "Your digital space needs sustenance to thrive. We offer sanctuary in our cloud realms for a modest offering of $5-$10 monthly, though some magical spaces can exist free of earthly bonds.",
55 | "faqs.question4": "How long does the enchantment take?",
56 | "faqs.answer4":
57 | "We weave our digital tapestries over 6 weeks, though more complex spells may require additional time to perfect.",
58 | "faqs.question5": "What if the vision isn't aligned?",
59 | "faqs.answer5":
60 | "Before we begin our craft, we'll create a mirror of possibilities - a mockup reflecting your dreams. If it doesn't capture your essence, we'll start fresh until it resonates perfectly.",
61 | "faqs.question6": "Can I reshape the magic myself?",
62 | "faqs.answer6":
63 | "We'll empower you with the ability to weave new words and, in some cases, reshape the very fabric of your digital space.",
64 | "faqs.question7": "Where will this digital realm reside?",
65 | "faqs.answer7":
66 | "We'll guide you to establish your digital sanctuary, ensuring you hold the keys to your kingdom while we tend to its needs.",
67 | "faqs.question8": "What if I seek new guardians?",
68 | "faqs.answer8":
69 | "Your digital realm remains yours to command. We provide full sovereignty over your domain, including its sacred source code.",
70 | "faqs.question9": "Who crafts the stories within?",
71 | "faqs.answer9":
72 | "If you haven't yet written your digital tale, we'll gather to weave stories that capture your essence and craft them into reality.",
73 | "faqs.question10": "What mystical tools do you wield?",
74 | "faqs.answer10":
75 | "We choose our instruments based on the song your project wishes to sing. Astro for swift, light melodies; WooCommerce or Shopify for grand market symphonies.",
76 | "faq.otherquestions": "Other questions?",
77 | "thanks.subtitle": "Mail sent successfully",
78 | "thanks.title": "Thank you",
79 | "thanks.content": "We will get back to you as soon as possible",
80 | "contact.title": "Contact",
81 | "contact.subtitle":
82 | "Let's weave digital dreams together, one pixel at a time",
83 | "contact.name": "Name",
84 | "contact.email": "Email",
85 | "contact.message": "Message",
86 | "contact.company": "Company",
87 | "contact.agree": "By sending this, you agree to our",
88 | "contact.send": "Send",
89 | "blog.title": "Blog",
90 | "blog.subtitle": "Chronicles of Digital Craftsmanship",
91 | "blog.gotoproject": "Go to project",
92 | "footer.newsletter": "Subscribe to",
93 | "footer.newsletter2": "our newsletter",
94 | "footer.yourmail": "Your email",
95 | newsletter_subscribe: "Subscribe to our newsletter",
96 | },
97 | it: {
98 | or: "o",
99 | contact: "Contattaci",
100 | contacts: "Contatti",
101 | contactus: "Contattaci",
102 | projects: "Progetti",
103 | services: "Servizi",
104 | homepage: "Homepage",
105 | tagline:
106 | "Intrecciamo sogni digitali in realtà. Dove l'innovazione danza con l'immaginazione, e ogni pixel racconta una storia di creatività senza confini.",
107 | "projects.yours": "Il tuo progetto",
108 | "projects.see": "Visualizza progetto",
109 | "hero.title.main": "Plasmiamo",
110 | "hero.title.1": "visioni",
111 | "hero.title.2": "sogni",
112 | "hero.title.3": "mondi",
113 | "hero.title.4": "futuri",
114 | "hero.subtitle":
115 | "Evochiamo regni digitali dove l'immaginazione prende il volo e le possibilità non conoscono limiti",
116 | "hero.scroll": "scorri per scoprire",
117 | "websites.title": "Siti",
118 | "apps.title": "App",
119 | "uiux.title": "Design UI/UX",
120 | "seo.title": "SEO",
121 | "advertising.title": "Pubblicità",
122 | "websites.content":
123 | "Scolpiamo paesaggi digitali dove i sogni prendono forma. Le nostre creazioni fondono arte e innovazione, creando spazi che ispirano e trasformano.",
124 | "apps.content":
125 | "Forgiamo compagni digitali che danzano sotto le tue dita. Creiamo strumenti che sembrano magia, ma funzionano come orologi.",
126 | "uiux.content":
127 | "Dipingiamo esperienze che sembrano naturali. Ogni interazione è una pennellata nella nostra tela di viaggi digitali senza soluzione di continuità.",
128 | "seo.content":
129 | "Tracciamo percorsi attraverso il cosmo digitale. Guidiamo la tua storia verso chi ne cerca la luce, usando i dati come bussola.",
130 | "advertising.content":
131 | "Creiamo echi digitali che risuonano attraverso schermi e cuori. Trasformiamo sussurri in conversazioni che contano.",
132 | "privacy.wip": "Lavori in corso",
133 | "privacy.wip.content": "Questa pagina verrà aggiornata a breve",
134 | "faqs.question1": "Qual è il vostro processo creativo?",
135 | "faqs.answer1":
136 | "Ogni viaggio inizia con una scintilla di immaginazione. Ci immergiamo nella tua visione, creiamo prototipi di possibilità e iteriamo fino a quando non accade la magia.",
137 | "faqs.question2": "Come approcciate la creazione digitale?",
138 | "faqs.answer2":
139 | "Ogni progetto è una costellazione unica. Investiamo tipicamente 4-6 settimane per dar vita alla tua visione, con investimenti da €3000 per giardini digitali a €4500 per mercati incantati.",
140 | "faqs.question3": "E riguardo alla cura continua?",
141 | "faqs.answer3":
142 | "Il tuo spazio digitale necessita di nutrimento per prosperare. Offriamo santuario nei nostri reami cloud per una modesta offerta di $5-$10 mensili, anche se alcuni spazi magici possono esistere liberi da vincoli terreni.",
143 | "faqs.question4": "Quanto dura l'incantesimo?",
144 | "faqs.answer4":
145 | "Tessiamo le nostre tappezzerie digitali in 6 settimane, anche se incantesimi più complessi potrebbero richiedere tempo aggiuntivo per la perfezione.",
146 | "faqs.question5": "E se la visione non è allineata?",
147 | "faqs.answer5":
148 | "Prima di iniziare il nostro mestiere, creeremo uno specchio di possibilità - un mockup che riflette i tuoi sogni. Se non cattura la tua essenza, ricominceremo da capo fino a quando non risuonerà perfettamente.",
149 | "faqs.question6": "Posso rimodellare la magia da solo?",
150 | "faqs.answer6":
151 | "Ti daremo il potere di tessere nuove parole e, in alcuni casi, rimodellare il tessuto stesso del tuo spazio digitale.",
152 | "faqs.question7": "Dove risiederà questo regno digitale?",
153 | "faqs.answer7":
154 | "Ti guideremo a stabilire il tuo santuario digitale, assicurandoti che tu detenga le chiavi del tuo regno mentre noi ci prendiamo cura delle sue necessità.",
155 | "faqs.question8": "E se cercassi nuovi guardiani?",
156 | "faqs.answer8":
157 | "Il tuo regno digitale rimane tuo da comandare. Ti forniamo piena sovranità sul tuo dominio, incluso il suo codice sorgente sacro.",
158 | "faqs.question9": "Chi crea le storie all'interno?",
159 | "faqs.answer9":
160 | "Se non hai ancora scritto il tuo racconto digitale, ci riuniremo per tessere storie che catturino la tua essenza e le trasformeremo in realtà.",
161 | "faqs.question10": "Quali strumenti mistici utilizzate?",
162 | "faqs.answer10":
163 | "Scegliamo i nostri strumenti in base alla canzone che il tuo progetto desidera cantare. Astro per melodie veloci e leggere; WooCommerce o Shopify per grandi sinfonie di mercato.",
164 | "faq.otherquestions": "Altre domande?",
165 | "thanks.subtitle": "Mail inviata con successo",
166 | "thanks.title": "Grazie",
167 | "thanks.content": "Ti risponderemo il prima possibile",
168 | "contact.title": "Contatti",
169 | "contact.subtitle": "Tessiamo insieme sogni digitali, un pixel alla volta",
170 | "contact.name": "Nome",
171 | "contact.email": "Email",
172 | "contact.message": "Messaggio",
173 | "contact.company": "Azienda",
174 | "contact.agree": "Cliccando invia accetti la nostra",
175 | "contact.send": "Invia",
176 | "blog.title": "Blog",
177 | "blog.subtitle": "Cronache dell'Artigianato Digitale",
178 | "blog.gotoproject": "Vai al progetto",
179 | "footer.newsletter": "Iscriviti alla",
180 | "footer.newsletter2": "newsletter",
181 | "footer.yourmail": "La tua email",
182 | newsletter_subscribe: "Iscriviti alla nostra newsletter",
183 | },
184 | } as const;
185 |
186 | export const showDefaultLang = false;
187 |
--------------------------------------------------------------------------------
/src/i18n/utils.ts:
--------------------------------------------------------------------------------
1 | import { ui, defaultLang, showDefaultLang } from "./ui";
2 |
3 | export function getLangFromUrl(url: URL) {
4 | const [, lang] = url.pathname.split("/");
5 | if (lang in ui) return lang as keyof typeof ui;
6 | return defaultLang;
7 | }
8 |
9 | export function getUrlWithoutLang(url: URL) {
10 | const [, langOrPath, ...pathLocale] = url.pathname.split("/");
11 |
12 | if (langOrPath in ui) {
13 | return `/${pathLocale.join("/")}`;
14 | } else {
15 | return `/${langOrPath}${pathLocale.length ? "/" + pathLocale.join("/") : ""}`;
16 | }
17 | }
18 |
19 | export function useTranslations(lang: keyof typeof ui) {
20 | return function t(key: keyof (typeof ui)[typeof defaultLang]) {
21 | return ui[lang][key] || ui[defaultLang][key];
22 | };
23 | }
24 |
25 | export function useTranslatedPath(lang: keyof typeof ui) {
26 | return function translatePath(path: string, l: string = lang) {
27 | return !showDefaultLang && l === defaultLang ? path : `/${l}${path}`;
28 | };
29 | }
30 |
--------------------------------------------------------------------------------
/src/layouts/BaseLayout.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import type { AstroSeoProps } from "@astrolib/seo";
3 | import BaseHead from "@components/BaseHead.astro";
4 | import BackgroundLines from "@components/global/BackgroundLines.astro";
5 | import Footer from "@components/global/Footer.astro";
6 | import Navigation from "@components/global/Navigation.astro";
7 | import { getLangFromUrl } from "../i18n/utils";
8 |
9 | type Props = {
10 | seo?: AstroSeoProps;
11 | };
12 |
13 | const { seo: seoProp } = Astro.props;
14 |
15 | const lang = getLangFromUrl(Astro.url);
16 |
17 | const shareImage = new URL("/images/meta/majestico_share.gif", Astro.site).toString();
18 |
19 | const defaultSeo: AstroSeoProps = {
20 | title: "Web Agency Leading in Performant Web Design Solutions - Majestico Studio",
21 | description:
22 | "Majestico Studio excels in creating fast, user-friendly websites with a focus on aesthetic design and SEO optimization, ensuring a standout online presence",
23 | canonical: "https://majestico.co",
24 | openGraph: {
25 | url: "https://majestico.co",
26 | title: "Web Agency Leading in Performant Web Design Solutions - Majestico Studio",
27 | description:
28 | "Majestico Studio excels in creating fast, user-friendly websites with a focus on aesthetic design and SEO optimization, ensuring a standout online presence",
29 | images: [
30 | {
31 | url: shareImage,
32 | width: 1200,
33 | height: 630,
34 | alt: "Social open graph",
35 | type: "image/gif",
36 | },
37 | {
38 | url: shareImage,
39 | width: 4096,
40 | height: 4096,
41 | alt: "Twitter open graph",
42 | type: "image/gif",
43 | },
44 | ],
45 | site_name: "Majestico",
46 | },
47 | twitter: {
48 | handle: "@majesticostudio",
49 | site: "@majesticostudio",
50 | cardType: "summary_large_image",
51 | },
52 | additionalMetaTags: [
53 | {
54 | name: "publisher",
55 | content: "Charlie Foster",
56 | },
57 | ],
58 | };
59 |
60 | const seo = {
61 | ...defaultSeo,
62 | ...seoProp,
63 | };
64 | ---
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/src/layouts/MarkdownPostLayout.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { Image } from "astro:assets";
3 | import type { CollectionEntry } from "astro:content";
4 | import Cta from "@/components/blog/Cta.astro";
5 | import type { AstroSeoProps } from "@astrolib/seo";
6 | import Comments from "@components/blog/Comments.astro";
7 | import Title from "@components/global/Title.astro";
8 | import { getLangFromUrl, useTranslatedPath, useTranslations } from "@i18n/utils";
9 | import { Icon } from "astro-icon/components";
10 | import BaseLayout from "./BaseLayout.astro";
11 |
12 | const lang = getLangFromUrl(Astro.url);
13 | const t = useTranslations(lang);
14 | const translatePath = useTranslatedPath(lang);
15 |
16 | type Props = {
17 | frontmatter: CollectionEntry<"projects"> | CollectionEntry<"posts">;
18 | body: string;
19 | seo?: AstroSeoProps;
20 | };
21 |
22 | const { frontmatter, body, seo } = Astro.props;
23 |
24 | function getArticleReadingTime(body: string): number {
25 | if (!body) return 0;
26 | const wordsPerMinute = 183;
27 | const numberOfWords = body.split(/\s/g).length;
28 | const minutes = numberOfWords / wordsPerMinute;
29 | const readTime = Math.ceil(minutes);
30 | return readTime;
31 | }
32 |
33 | const readingTime = getArticleReadingTime(body);
34 | ---
35 |
36 |
37 |
38 |
39 |
40 |
${frontmatter.data.author.name} on ${frontmatter.data.pubDate
44 | .toString()
45 | .slice(0, 10)}`}
46 | />
47 |
48 |
49 | {frontmatter.data.description}
50 |
51 |
52 | {
53 | frontmatter.data?.link && (
54 |
55 | {t("blog.gotoproject")}
56 |
57 | )
58 | }
59 |
60 |
61 | {
62 | frontmatter.data.image != null ? (
63 |
64 | ) : frontmatter.data.video ? (
65 |
66 | ) : (
67 |
{frontmatter.data.title}
68 | )
69 | }
70 |
71 |
72 | {(frontmatter.data?.tags?.length ?? 0) > 0 &&
TAGS: }
73 |
74 | {
75 | frontmatter?.data.tags?.map((tag: string) => (
76 |
77 | {tag}
78 |
79 | ))
80 | }
81 |
82 |
83 |
~{readingTime} MIN
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/src/pages/404.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Error404 from "@/components/infopages/Error404.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "404 Error: Page Not Found - Majestico Studio",
8 | description:
9 | "Oops! The page you're looking for doesn't exist. Navigate back to Majestico Studio's homepage for our full range of web design and SEO services.",
10 | canonical: "https://majestico.co/404/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/author/[author].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@layouts/BaseLayout.astro";
3 | import Author from "@components/blog/Author.astro";
4 | import { getCollection } from "astro:content";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | export async function getStaticPaths() {
8 | const authors = await getCollection("authors");
9 |
10 | return authors
11 | .map((entry) => {
12 | const [lang, ...slug] = entry.slug.split("/");
13 | return { params: { lang, author: slug.join("/") || undefined }, props: entry };
14 | })
15 | .filter((entry) => entry.params.lang === "en");
16 | }
17 |
18 | const author = Astro.props;
19 |
20 | const seo: AstroSeoProps = {
21 | title: author.data.name,
22 | description: author.data.description,
23 | canonical: `https://majestico.co/author/${author.slug}/`,
24 | };
25 | ---
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/pages/author/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import BaseLayout from "@layouts/BaseLayout.astro";
4 | import Authors from "@components/blog/Authors.astro";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const allAuthors = await getCollection("authors");
8 | const pageTitle = "Tag Index";
9 |
10 | const seo: AstroSeoProps = {
11 | title: "Authors - Majestico Studio: Meet Our Expert Team",
12 | description:
13 | "Discover the creative minds behind Majestico Studio. Our authors are industry experts in web design, SEO, and digital marketing, sharing valuable insights.",
14 | canonical: "https://majestico.co/author/",
15 | };
16 | ---
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/pages/blog/[...slug].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import MarkdownPostLayout from "../../layouts/MarkdownPostLayout.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | export async function getStaticPaths() {
7 | const blogEntries = await getCollection("posts");
8 |
9 | return blogEntries
10 | .map((entry) => {
11 | const [lang, ...slug] = entry.slug.split("/");
12 | return { params: { lang, slug: slug.join("/") || undefined }, props: entry };
13 | })
14 | .filter((entry) => entry.params.lang === "en");
15 | }
16 |
17 | const entry = Astro.props;
18 | const { Content } = await entry.render();
19 |
20 | const seo: AstroSeoProps = {
21 | title: entry.data.title,
22 | description: entry.data.description,
23 | canonical: `https://majestico.co/blog/${entry.slug}/`,
24 | openGraph: {
25 | url: entry.slug,
26 | title: entry.data.title,
27 | description: "{frontmatter.description}",
28 | images: [
29 | {
30 | url: "https://majestico.co/opengraph/social-og.jpg",
31 | width: 1200,
32 | height: 630,
33 | alt: "Social open graph",
34 | type: "image/jpeg",
35 | },
36 | {
37 | url: "https://majestico.co/opengraph/twitter-og.jpg",
38 | width: 4096,
39 | height: 4096,
40 | alt: "Twitter open graph",
41 | type: "image/jpeg",
42 | },
43 | { url: "https://majestico.co/opengraph/social-og.jpg" },
44 | { url: "https://majestico.co/opengraph/twitter-og.jpg" },
45 | ],
46 | site_name: "YourSitesName",
47 | },
48 | twitter: {
49 | handle: "@TwitterHandle",
50 | site: "@site",
51 | cardType: "summary_large_image",
52 | },
53 | };
54 | ---
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/pages/blog/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Articles from "@components/blog/Articles.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Majestico Studio Blog: Insights and Updates in Web Design, Web dev and SEO",
8 | description:
9 | "Explore the Majestico Studio Blog for the latest trends, tips, and insights in web design, web dev and SEO. Stay updated with our innovative digital solutions.",
10 | canonical: "https://majestico.co/blog/",
11 | openGraph: {
12 | url: "https://majestico.co/blog",
13 | title: "Majestico Studio Blog: Insights and Updates in Web Design, Web dev and SEO",
14 | description:
15 | "Stay informed with the latest in web design and SEO on the Majestico Studio Blog. Expert advice, tips, and industry insights await you.",
16 | images: [
17 | {
18 | url: "https://majestico.co/opengraph/social-og.jpg",
19 | width: 1200,
20 | height: 630,
21 | alt: "Social open graph image of Majestico Studio Blog",
22 | type: "image/jpeg",
23 | },
24 | {
25 | url: "https://majestico.co/opengraph/twitter-og.jpg",
26 | width: 4096,
27 | height: 4096,
28 | alt: "Twitter open graph image of Majestico Studio Blog",
29 | type: "image/jpeg",
30 | },
31 | { url: "https://majestico.co/opengraph/social-og.jpg" },
32 | { url: "https://majestico.co/opengraph/twitter-og.jpg" },
33 | ],
34 | site_name: "Majestico Studio",
35 | },
36 | twitter: {
37 | handle: "@majesticostudio",
38 | site: "@majesticostudio",
39 | cardType: "summary_large_image",
40 | },
41 | };
42 | ---
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/pages/contact.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Contact from "@/components/forms/Contact.astro";
4 | import Cta from "@components/blog/Cta.astro";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const seo: AstroSeoProps = {
8 | title: "Contact Majestico Studio: Get in Touch for Innovative Web Solutions",
9 | description:
10 | "Reach out to Majestico Studio for expert web design and SEO services. Connect with us to discuss your project and explore cutting-edge web solutions.",
11 | canonical: "https://majestico.co/contact/",
12 | };
13 | ---
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/pages/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Hero from "@components/landing/Hero.astro";
4 | import Description from "@components/landing/Description.astro";
5 | import WorkPreview from "@components/landing/WorkPreview.astro";
6 | ---
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/pages/it/404.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Error404 from "@/components/infopages/Error404.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "404 Error: Page Not Found - Majestico Studio",
8 | description:
9 | "Oops! The page you're looking for doesn't exist. Navigate back to Majestico Studio's homepage for our full range of web design and SEO services.",
10 | canonical: "https://majestico.co/it/404/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/it/author/[author].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@layouts/BaseLayout.astro";
3 | import Author from "@components/blog/Author.astro";
4 | import { getCollection } from "astro:content";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | export async function getStaticPaths() {
8 | const authors = await getCollection("authors");
9 |
10 | return authors
11 | .map((entry) => {
12 | const [lang, ...slug] = entry.slug.split("/");
13 | return { params: { lang, author: slug.join("/") || undefined }, props: entry };
14 | })
15 | .filter((entry) => entry.params.lang === "it");
16 | }
17 |
18 | const author = Astro.props;
19 |
20 | const seo: AstroSeoProps = {
21 | title: author.data.name,
22 | description: author.data.description,
23 | canonical: `https://majestico.co/it/author/${author.slug}/`,
24 | };
25 | ---
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/pages/it/author/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import BaseLayout from "@layouts/BaseLayout.astro";
4 | import Authors from "@components/blog/Authors.astro";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const allAuthors = await getCollection("authors");
8 | const pageTitle = "Tag Index";
9 |
10 | const seo: AstroSeoProps = {
11 | title: "Authors - Majestico Studio: Meet Our Expert Team",
12 | description:
13 | "Discover the creative minds behind Majestico Studio. Our authors are industry experts in web design, SEO, and digital marketing, sharing valuable insights.",
14 | canonical: "https://majestico.co/it/author/",
15 | };
16 | ---
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/pages/it/blog/[...slug].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import MarkdownPostLayout from "@layouts/MarkdownPostLayout.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | export async function getStaticPaths() {
7 | const blogEntries = await getCollection("posts");
8 |
9 | return blogEntries
10 | .map((entry) => {
11 | const [lang, ...slug] = entry.slug.split("/");
12 | return { params: { lang, slug: slug.join("/") || undefined }, props: entry };
13 | })
14 | .filter((entry) => entry.params.lang === "it");
15 | }
16 |
17 | const entry = Astro.props;
18 | const { Content } = await entry.render();
19 |
20 | const seo: AstroSeoProps = {
21 | title: entry.data.title,
22 | description: entry.data.description,
23 | canonical: `https://majestico.co/it/blog/${entry.slug}/`,
24 | openGraph: {
25 | url: entry.slug,
26 | title: entry.data.title,
27 | description: "{frontmatter.description}",
28 | images: [
29 | {
30 | url: "https://majestico.co/opengraph/social-og.jpg",
31 | width: 1200,
32 | height: 630,
33 | alt: "Social open graph",
34 | type: "image/jpeg",
35 | },
36 | {
37 | url: "https://majestico.co/opengraph/twitter-og.jpg",
38 | width: 4096,
39 | height: 4096,
40 | alt: "Twitter open graph",
41 | type: "image/jpeg",
42 | },
43 | { url: "https://majestico.co/opengraph/social-og.jpg" },
44 | { url: "https://majestico.co/opengraph/twitter-og.jpg" },
45 | ],
46 | site_name: "YourSitesName",
47 | },
48 | twitter: {
49 | handle: "@TwitterHandle",
50 | site: "@site",
51 | cardType: "summary_large_image",
52 | },
53 | };
54 | ---
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/pages/it/blog/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@layouts/BaseLayout.astro";
3 | import Articles from "@components/blog/Articles.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Majestico Studio Blog: Insights and Updates in Web Design, Web dev and SEO",
8 | description:
9 | "Explore the Majestico Studio Blog for the latest trends, tips, and insights in web design, web dev and SEO. Stay updated with our innovative digital solutions.",
10 | canonical: "https://majestico.co/it/blog/",
11 | openGraph: {
12 | url: "https://majestico.co/blog",
13 | title: "Majestico Studio Blog: Insights and Updates in Web Design, Web dev and SEO",
14 | description:
15 | "Stay informed with the latest in web design and SEO on the Majestico Studio Blog. Expert advice, tips, and industry insights await you.",
16 | images: [
17 | {
18 | url: "https://majestico.co/opengraph/social-og.jpg",
19 | width: 1200,
20 | height: 630,
21 | alt: "Social open graph image of Majestico Studio Blog",
22 | type: "image/jpeg",
23 | },
24 | {
25 | url: "https://majestico.co/opengraph/twitter-og.jpg",
26 | width: 4096,
27 | height: 4096,
28 | alt: "Twitter open graph image of Majestico Studio Blog",
29 | type: "image/jpeg",
30 | },
31 | { url: "https://majestico.co/opengraph/social-og.jpg" },
32 | { url: "https://majestico.co/opengraph/twitter-og.jpg" },
33 | ],
34 | site_name: "Majestico Studio",
35 | },
36 | twitter: {
37 | handle: "@majesticostudio",
38 | site: "@majesticostudio",
39 | cardType: "summary_large_image",
40 | },
41 | };
42 | ---
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/pages/it/contact.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Contact from "@/components/forms/Contact.astro";
4 | import Cta from "@components/blog/Cta.astro";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const seo: AstroSeoProps = {
8 | title: "Contact Majestico Studio: Get in Touch for Innovative Web Solutions",
9 | description:
10 | "Reach out to Majestico Studio for expert web design and SEO services. Connect with us to discuss your project and explore cutting-edge web solutions.",
11 | canonical: "https://majestico.co/it/contact/",
12 | };
13 | ---
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/pages/it/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Hero from "@components/landing/Hero.astro";
4 | import Description from "@components/landing/Description.astro";
5 | import WorkPreview from "@components/landing/WorkPreview.astro";
6 | ---
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/pages/it/privacy.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import PrivacyPage from "@/components/infopages/Privacy.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Privacy Policy - Majestico Studio: Your Privacy Matters",
8 | description:
9 | "Our Privacy Policy outlines how Majestico Studio protects your personal information. Discover our commitment to your privacy and data security.",
10 | canonical: "https://majestico.co/it/privacy/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/it/services/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import ServicesMain from "@/components/services/ServicesMain.astro";
4 |
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const seo: AstroSeoProps = {
8 | title: "Services | Majestico Studio",
9 | description: "We are a digital studio that creates beautiful and functional websites and applications.",
10 | canonical: "https://majestico.co/services/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/it/tags/[tag].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@layouts/BaseLayout.astro";
3 | import Tag from "@components/blog/Tag.astro";
4 | import { getCollection } from "astro:content";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | export async function getStaticPaths() {
8 | const allPosts = (await getCollection("posts")).filter((post) => {
9 | const [postLang, ...slug] = post.slug.split("/");
10 | return postLang === "en";
11 | });
12 |
13 | const uniqueTags = [...new Set(allPosts.map((post) => post.data.tags).flat())];
14 | return uniqueTags.map((tag) => {
15 | const filteredPosts = allPosts.filter((post) => post.data.tags.includes(tag));
16 | return {
17 | params: { tag },
18 | props: { posts: filteredPosts },
19 | };
20 | });
21 | }
22 | const { tag } = Astro.params;
23 | const { posts } = Astro.props;
24 |
25 | const seo: AstroSeoProps = {
26 | title: `${tag} | Majestico Studio`,
27 | description: `Explore articles and insights on '${tag}' at Majestico Studio. Dive into a wealth of knowledge covering the latest trends and tips in web design and SEO.`,
28 | canonical: `https://majestico.co/it/tags/${tag}/`,
29 | };
30 | ---
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/pages/it/tags/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import BaseLayout from "@layouts/BaseLayout.astro";
4 | import Tags from "@components/blog/Tags.astro";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const seo: AstroSeoProps = {
8 | title: "Tags - Explore Topics at Majestico Studio",
9 | description:
10 | "Browse through the diverse range of tags at Majestico Studio to find articles and insights tailored to your interests in web design and SEO.",
11 | canonical: "https://majestico.co/it/tags/",
12 | };
13 | ---
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/pages/it/terms.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import TermsPage from "@/components/infopages/Terms.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Terms of Service - Majestico Studio: Understand Our Terms",
8 | description:
9 | "Read the Terms of Service for Majestico Studio. Learn about our guidelines and your responsibilities when using our web design and SEO services.",
10 | canonical: "https://majestico.co/it/terms/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/it/thank-you.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Thanks from "@components/infopages/ThankYou.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Thank You - Majestico Studio: Email Successfully Sent",
8 | description:
9 | "Thank you for reaching out to Majestico Studio! Your email has been successfully sent. We appreciate your interest and will respond promptly.",
10 | canonical: "https://majestico.co/it/thank-you/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/it/work/[...slug].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import MarkdownPostLayout from "@layouts/MarkdownPostLayout.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | export async function getStaticPaths() {
7 | const projectsEntries = await getCollection("projects");
8 |
9 | return projectsEntries
10 | .map((entry) => {
11 | const [lang, ...slug] = entry.slug.split("/");
12 | return { params: { lang, slug: slug.join("/") || undefined }, props: entry };
13 | })
14 | .filter((entry) => entry.params.lang === "en");
15 | }
16 |
17 | const entry = Astro.props;
18 | const { Content } = await entry.render();
19 |
20 | const seo: AstroSeoProps = {
21 | title: `Project ${entry.data.title} - Majestico`,
22 | description: entry.data.description,
23 | canonical: `https://majestico.co/it/work/${entry.slug}/`,
24 | openGraph: {
25 | url: entry.slug,
26 | title: entry.data.title,
27 | description: "{frontmatter.description}",
28 | images: [
29 | {
30 | url: "https://majestico.co/opengraph/social-og.jpg",
31 | width: 1200,
32 | height: 630,
33 | alt: "Social open graph",
34 | type: "image/jpeg",
35 | },
36 | {
37 | url: "https://majestico.co/opengraph/twitter-og.jpg",
38 | width: 4096,
39 | height: 4096,
40 | alt: "Twitter open graph",
41 | type: "image/jpeg",
42 | },
43 | { url: "https://majestico.co/opengraph/social-og.jpg" },
44 | { url: "https://majestico.co/opengraph/twitter-og.jpg" },
45 | ],
46 | site_name: "YourSitesName",
47 | },
48 | twitter: {
49 | handle: "@TwitterHandle",
50 | site: "@site",
51 | cardType: "summary_large_image",
52 | },
53 | };
54 | ---
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/pages/privacy.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import PrivacyPage from "@/components/infopages/Privacy.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Privacy Policy - Majestico Studio: Your Privacy Matters",
8 | description:
9 | "Our Privacy Policy outlines how Majestico Studio protects your personal information. Discover our commitment to your privacy and data security.",
10 | canonical: "https://majestico.co/privacy/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/rss.xml.ts:
--------------------------------------------------------------------------------
1 | import rss from "@astrojs/rss";
2 | import { getCollection } from "astro:content";
3 |
4 | export async function GET(context: any) {
5 | const blog = await getCollection("posts");
6 | return rss({
7 | title: "Majestico's Blog",
8 | description: "A humble Astronaut's guide to the stars",
9 | site: context.site,
10 | items: blog.map((post) => ({
11 | title: post.data.title,
12 | pubDate: post.data.pubDate,
13 | description: post.data.description,
14 | // Compute RSS link from post `slug`
15 | link: `/blog/${post.slug}/`,
16 | })),
17 | });
18 | }
19 |
--------------------------------------------------------------------------------
/src/pages/services/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import ServicesMain from "@/components/services/ServicesMain.astro";
4 |
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | const seo: AstroSeoProps = {
8 | title: "Services | Majestico Studio",
9 | description: "We are a digital studio that creates beautiful and functional websites and applications.",
10 | canonical: "https://majestico.co/services/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/tags/[tag].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@layouts/BaseLayout.astro";
3 | import Tag from "@components/blog/Tag.astro";
4 | import { getCollection } from "astro:content";
5 | import { type AstroSeoProps } from "@astrolib/seo";
6 |
7 | export async function getStaticPaths() {
8 | const allPosts = (await getCollection("posts")).filter((post) => {
9 | const [postLang, ...slug] = post.slug.split("/");
10 | return postLang === "en";
11 | });
12 |
13 | const uniqueTags = [...new Set(allPosts.map((post) => post.data.tags).flat())];
14 | return uniqueTags.map((tag) => {
15 | const filteredPosts = allPosts.filter((post) => post.data.tags.includes(tag));
16 | return {
17 | params: { tag },
18 | props: { posts: filteredPosts },
19 | };
20 | });
21 | }
22 |
23 | const { tag } = Astro.params;
24 | const { posts } = Astro.props;
25 |
26 | const seo: AstroSeoProps = {
27 | title: `${tag} | Majestico Studio`,
28 | description: `Explore articles and insights on '${tag}' at Majestico Studio. Dive into a wealth of knowledge covering the latest trends and tips in web design and SEO.`,
29 | canonical: `https://majestico.co/tags/${tag}/`,
30 | };
31 | ---
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/src/pages/tags/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@layouts/BaseLayout.astro";
3 | import Tags from "@components/blog/Tags.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Tags - Explore Topics at Majestico Studio",
8 | description:
9 | "Browse through the diverse range of tags at Majestico Studio to find articles and insights tailored to your interests in web design and SEO.",
10 | canonical: "https://majestico.co/tags/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/terms.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import TermsPage from "@/components/infopages/Terms.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Terms of Service - Majestico Studio: Understand Our Terms",
8 | description:
9 | "Read the Terms of Service for Majestico Studio. Learn about our guidelines and your responsibilities when using our web design and SEO services.",
10 | canonical: "https://majestico.co/terms/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/thank-you.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import BaseLayout from "@/layouts/BaseLayout.astro";
3 | import Thanks from "@components/infopages/ThankYou.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | const seo: AstroSeoProps = {
7 | title: "Thank You - Majestico Studio: Email Successfully Sent",
8 | description:
9 | "Thank you for reaching out to Majestico Studio! Your email has been successfully sent. We appreciate your interest and will respond promptly.",
10 | canonical: "https://majestico.co/thank-you/",
11 | };
12 | ---
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/pages/work/[...slug].astro:
--------------------------------------------------------------------------------
1 | ---
2 | import { getCollection } from "astro:content";
3 | import MarkdownPostLayout from "../../layouts/MarkdownPostLayout.astro";
4 | import { type AstroSeoProps } from "@astrolib/seo";
5 |
6 | export async function getStaticPaths() {
7 | const projectsEntries = await getCollection("projects");
8 |
9 | return projectsEntries
10 | .map((entry) => {
11 | const [lang, ...slug] = entry.slug.split("/");
12 | return { params: { lang, slug: slug.join("/") || undefined }, props: entry };
13 | })
14 | .filter((entry) => entry.params.lang === "en");
15 | }
16 |
17 | const entry = Astro.props;
18 | const { Content } = await entry.render();
19 |
20 | const seo: AstroSeoProps = {
21 | title: `Project ${entry.data.title} - Majestico`,
22 | description: entry.data.description,
23 | canonical: `https://majestico.co/work/${entry.slug}/`,
24 | openGraph: {
25 | url: entry.slug,
26 | title: entry.data.title,
27 | description: "{frontmatter.description}",
28 | images: [
29 | {
30 | url: "https://majestico.co/opengraph/social-og.jpg",
31 | width: 1200,
32 | height: 630,
33 | alt: "Social open graph",
34 | type: "image/jpeg",
35 | },
36 | {
37 | url: "https://majestico.co/opengraph/twitter-og.jpg",
38 | width: 4096,
39 | height: 4096,
40 | alt: "Twitter open graph",
41 | type: "image/jpeg",
42 | },
43 | { url: "https://majestico.co/opengraph/social-og.jpg" },
44 | { url: "https://majestico.co/opengraph/twitter-og.jpg" },
45 | ],
46 | site_name: "YourSitesName",
47 | },
48 | twitter: {
49 | handle: "@TwitterHandle",
50 | site: "@site",
51 | cardType: "summary_large_image",
52 | },
53 | };
54 | ---
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/styles/global.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @font-face {
6 | font-family: "Satoshi";
7 | src: url("/fonts/Satoshi-Variable.woff2") format("woff");
8 | font-weight: normal;
9 | font-style: normal;
10 | font-display: swap;
11 | }
12 |
13 | :root {
14 | font-family: "Inter", sans-serif;
15 | }
16 |
17 | @supports (font-variation-settings: normal) {
18 | :root {
19 | font-family: "Inter var", sans-serif;
20 | }
21 | }
22 |
23 | :root {
24 | --grid-rows-color: rgb(255, 255, 255);
25 | --astro-code-color-text: #ffffff;
26 | --astro-code-color-background: #131313;
27 | --astro-code-token-constant: #8b919b;
28 | --astro-code-token-string: #ffffff;
29 | --astro-code-token-comment: #8b919b;
30 | --astro-code-token-keyword: #e83906;
31 | --astro-code-token-parameter: #ffffff;
32 | --astro-code-token-function: #ffffff;
33 | --astro-code-token-string-expression: #c7f801;
34 | --astro-code-token-punctuation: #ffffff;
35 | --astro-code-token-link: #ffffff;
36 | --grid-gap: 1px;
37 | --base-padding-x: max(6vw, 60px);
38 | --base-padding-y: clamp(30px, 4vw, 50px);
39 | }
40 |
41 | @media (max-width: 812px) {
42 | :root {
43 | --base-padding-x: 25px;
44 | --base-padding-y: 25px;
45 | }
46 | }
47 |
48 | html {
49 | scrollbar-gutter: stable;
50 | @apply overflow-x-hidden bg-black text-stone-100;
51 | }
52 |
53 | /* Custom scrollbar */
54 |
55 | ::-webkit-scrollbar-track {
56 | border: none;
57 | background-color: #676767;
58 | }
59 | ::-webkit-scrollbar {
60 | width: 1px;
61 | background-color: transparent;
62 | }
63 | ::-webkit-scrollbar-thumb {
64 | background-color: #1b1816;
65 | border-radius: 2px;
66 | }
67 | ::-webkit-scrollbar-thumb:hover {
68 | background-color: #000;
69 | }
70 | .dark ::-webkit-scrollbar-thumb {
71 | background-color: #e8e1e1;
72 | }
73 | .dark ::-webkit-scrollbar-thumb:hover {
74 | background-color: #ffffff;
75 | }
76 |
77 | /* Selection */
78 |
79 | ::-moz-selection {
80 | color: black;
81 | background: white;
82 | }
83 | ::selection {
84 | color: black;
85 | background: white;
86 | }
87 | .dark ::-moz-selection {
88 | color: black;
89 | background: white;
90 | }
91 | .dark ::selection {
92 | color: black;
93 | background: white;
94 | }
95 |
96 | .select-none {
97 | -webkit-tap-highlight-color: transparent;
98 | -webkit-touch-callout: none;
99 | -webkit-user-select: none;
100 | -khtml-user-select: none;
101 | -moz-user-select: none;
102 | -ms-user-select: none;
103 | user-select: none;
104 | }
105 |
106 | .prose-styles {
107 | @apply prose mx-auto max-w-3xl text-lg text-slate-200 prose-headings:font-bold prose-headings:tracking-tighter prose-headings:text-white prose-a:text-slate-300 hover:prose-a:text-white prose-blockquote:border-l-slate-200 prose-blockquote:text-slate-200 prose-code:text-white prose-pre:rounded-lg prose-li:marker:text-slate-300;
108 | }
109 |
110 | .section {
111 | position: relative;
112 | width: 100%;
113 | display: grid;
114 | grid-template-columns: repeat(4, minmax(0, 1fr));
115 | column-gap: var(--grid-gap);
116 | }
117 |
118 | .dark-section {
119 | color: white;
120 | }
121 |
122 | .squircle {
123 | --squircle-smooth: 1;
124 | --squircle-radius: 10px;
125 | border-radius: var(--squircle-radius);
126 | mask-image: paint(squircle);
127 | }
128 |
129 | .squircle-bg {
130 | --squircle-smooth: 1;
131 | --squircle-radius: 10px;
132 | background: #272521;
133 | mask-image: paint(squircle);
134 | }
135 |
136 | .squircle-bg-white {
137 | --squircle-smooth: 1;
138 | --squircle-radius: 10px;
139 | background: #fff;
140 | mask-image: paint(squircle);
141 | }
142 |
143 | .squircle-hover:hover {
144 | --squircle-smooth: 1;
145 | --squircle-radius: 10px;
146 | background: #272521;
147 | mask-image: paint(squircle);
148 | }
149 |
150 | .squircle-white-hover:hover {
151 | --squircle-smooth: 1;
152 | --squircle-radius: 10px;
153 | background: #fff;
154 | mask-image: paint(squircle);
155 | }
156 |
--------------------------------------------------------------------------------
/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | const defaultTheme = require("tailwindcss/defaultTheme");
3 | const colors = require("tailwindcss/colors");
4 | module.exports = {
5 | content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"],
6 | theme: {
7 | screens: {
8 | sm: "540px",
9 | md: "768px",
10 | lg: "1024px",
11 | xl: "1280px",
12 | "2xl": "1536px",
13 | },
14 | extend: {
15 | borderRadius: {
16 | "4xl": "2rem",
17 | "5xl": "3rem",
18 | "6xl": "4rem",
19 | "7xl": "5rem",
20 | },
21 | colors: {
22 | primary: {
23 | 50: "#f3ffe4",
24 | 100: "#e4ffc5",
25 | 200: "#c9ff92",
26 | 300: "#a4ff54",
27 | 400: "#82fb20",
28 | 500: "#6cf901",
29 | 600: "#49b400",
30 | 700: "#388902",
31 | 800: "#2f6b09",
32 | 900: "#2a5a0d",
33 | 950: "#113300",
34 | },
35 | lime: {
36 | 50: "hsl(64, 100%, 95%)",
37 | 100: "hsl(66, 100%, 89%)",
38 | 200: "hsl(68, 100%, 79%)",
39 | 300: "hsl(70, 100%, 66%)",
40 | 400: "hsl(71, 96%, 55%)",
41 | 500: "hsl(72, 99%, 49%)",
42 | 600: "hsl(74, 100%, 35%)",
43 | 700: "hsl(74, 97%, 27%)",
44 | 800: "hsl(75, 84%, 23%)",
45 | 900: "hsl(76, 75%, 20%)",
46 | 950: "hsl(78, 100%, 10%)",
47 | },
48 | blue: {
49 | 50: "hsl(240, 100%, 97%)",
50 | 100: "hsl(245, 100%, 95%)",
51 | 200: "hsl(244, 100%, 90%)",
52 | 300: "hsl(247, 100%, 83%)",
53 | 400: "hsl(249, 100%, 73%)",
54 | 500: "hsl(252, 100%, 62%)",
55 | 600: "hsl(256, 100%, 54%)",
56 | 700: "hsl(255, 98%, 50%)",
57 | 800: "hsl(255, 97%, 42%)",
58 | 900: "hsl(256, 95%, 37%)",
59 | 950: "hsl(253, 100%, 23%)",
60 | },
61 | trinidad: {
62 | 50: "hsl(27, 100%, 96%)",
63 | 100: "hsl(28, 100%, 92%)",
64 | 200: "hsl(26, 100%, 83%)",
65 | 300: "hsl(24, 100%, 72%)",
66 | 400: "hsl(20, 100%, 61%)",
67 | 500: "hsl(18, 100%, 53%)",
68 | 600: "hsl(14, 95%, 47%)",
69 | 700: "hsl(11, 93%, 40%)",
70 | 800: "hsl(8, 84%, 34%)",
71 | 900: "hsl(9, 79%, 28%)",
72 | 950: "hsl(7, 86%, 15%)",
73 | },
74 | },
75 | fontFamily: {
76 | display: ["Satoshi", ...defaultTheme.fontFamily.sans],
77 | sans: ["Inter", ...defaultTheme.fontFamily.sans],
78 | mono: ["JetBrains Mono", ...defaultTheme.fontFamily.mono],
79 | },
80 | animation: {
81 | "pulse-fast": "pulse 1s cubic-bezier(0.4, 0, 0.6, 1) infinite",
82 | },
83 | },
84 | },
85 | safelist: [
86 | {
87 | pattern: /row-start-\d+/,
88 | variants: ["md"],
89 | },
90 | {
91 | pattern: /col-start-\d+/,
92 | variants: ["md"],
93 | },
94 | {
95 | pattern: /translate-y-\d+/,
96 | variants: ["md"],
97 | },
98 | ],
99 | plugins: [
100 | require.resolve("prettier-plugin-astro"),
101 | require("@tailwindcss/typography"),
102 | require("@tailwindcss/forms"),
103 | require("@tailwindcss/aspect-ratio"),
104 | ],
105 | overrides: [
106 | {
107 | files: "*.astro",
108 | options: {
109 | parser: "astro",
110 | },
111 | },
112 | ],
113 | };
114 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "astro/tsconfigs/strict",
3 | "compilerOptions": {
4 | "strictNullChecks": true,
5 | "baseUrl": "src",
6 | "paths": {
7 | "@/*": ["*"],
8 | "@lib/*": ["lib/*"],
9 | "@components/*": ["components/*"],
10 | "@layouts/*": ["layouts/*"],
11 | "@styles/*": ["styles/*"],
12 | "@utils/*": ["utils/*"],
13 | "@pages/*": ["pages/*"],
14 | "@assets/*": ["assets/*"],
15 | "@locales/*": ["locales/*"],
16 | "@i18n/*": ["i18n/*"],
17 | },
18 | },
19 | }
20 |
--------------------------------------------------------------------------------
/unlighthouse.config.ts:
--------------------------------------------------------------------------------
1 | ///
2 | import { defineConfig } from "unlighthouse";
3 |
4 | /*
5 | * https://unlighthouse.dev/api/config
6 | */
7 | export default defineConfig({
8 | site: "majestico.co",
9 | scanner: {
10 | exclude: [/^\/cdn-cgi\//],
11 | },
12 | ci: {
13 | budget: 90,
14 | buildStatic: true,
15 | },
16 | debug: true,
17 | cache: false,
18 | });
19 |
--------------------------------------------------------------------------------