all seo - tags updated

This commit is contained in:
Selvi 2026-03-06 15:44:50 +05:30
parent 59f9125b7b
commit 7a60622b4b
24 changed files with 1105 additions and 299 deletions

260
package-lock.json generated
View File

@ -11,7 +11,7 @@
"@fortawesome/fontawesome-free": "^7.2.0",
"@types/react-google-recaptcha": "2.1.9",
"aos": "^2.3.4",
"axios": "1.13.5",
"axios": "^1.13.5",
"bootstrap": "^5.3.8",
"gsap": "^3.14.2",
"isotope-layout": "^3.0.6",
@ -22,7 +22,10 @@
"react-google-recaptcha": "3.1.0",
"react-slick": "^0.31.0",
"sass": "^1.97.3",
"slick-carousel": "^1.8.1"
"selenium-webdriver": "^4.41.0",
"sitemap": "^9.0.1",
"slick-carousel": "^1.8.1",
"xml2js": "^0.6.2"
},
"devDependencies": {
"@types/aos": "^3.0.7",
@ -36,6 +39,12 @@
"typescript": "^5"
}
},
"node_modules/@bazel/runfiles": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz",
"integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==",
"license": "Apache-2.0"
},
"node_modules/@emnapi/core": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
@ -1154,7 +1163,6 @@
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
@ -1242,7 +1250,6 @@
"version": "20.19.33",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz",
"integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@ -1253,7 +1260,6 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@ -1287,6 +1293,15 @@
"@types/react": "*"
}
},
"node_modules/@types/sax": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
"integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.56.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz",
@ -1332,7 +1347,6 @@
"integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.56.0",
"@typescript-eslint/types": "8.56.0",
@ -1858,7 +1872,6 @@
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@ -1920,6 +1933,12 @@
"lodash.throttle": "^4.0.1"
}
},
"node_modules/arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"license": "MIT"
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@ -2421,6 +2440,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT"
},
"node_modules/countup.js": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.9.0.tgz",
@ -2821,7 +2846,6 @@
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@ -2995,7 +3019,6 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@ -3715,6 +3738,12 @@
"node": ">= 4"
}
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
"license": "MIT"
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
@ -3748,6 +3777,12 @@
"node": ">=0.8.19"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/internal-slot": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
@ -4302,6 +4337,18 @@
"node": ">=4.0"
}
},
"node_modules/jszip": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"license": "(MIT OR GPL-3.0-or-later)",
"dependencies": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"setimmediate": "^1.0.5"
}
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@ -4346,6 +4393,15 @@
"node": ">= 0.8.0"
}
},
"node_modules/lie": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"license": "MIT",
"dependencies": {
"immediate": "~3.0.5"
}
},
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@ -4810,6 +4866,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"license": "(MIT AND Zlib)"
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@ -4917,6 +4979,12 @@
"node": ">= 0.8.0"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"license": "MIT"
},
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@ -4970,7 +5038,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@ -5005,7 +5072,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@ -5048,6 +5114,27 @@
"react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/readable-stream/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT"
},
"node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@ -5207,6 +5294,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
"node_modules/safe-push-apply": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
@ -5247,7 +5340,6 @@
"resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz",
"integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==",
"license": "MIT",
"peer": true,
"dependencies": {
"chokidar": "^4.0.0",
"immutable": "^5.0.2",
@ -5263,12 +5355,46 @@
"@parcel/watcher": "^2.4.1"
}
},
"node_modules/sax": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz",
"integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==",
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=11.0.0"
}
},
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
"node_modules/selenium-webdriver": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.41.0.tgz",
"integrity": "sha512-1XxuKVhr9az24xwixPBEDGSZP+P0z3ZOnCmr9Oiep0MlJN2Mk+flIjD3iBS9BgyjS4g14dikMqnrYUPIjhQBhA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/SeleniumHQ"
},
{
"type": "opencollective",
"url": "https://opencollective.com/selenium"
}
],
"license": "Apache-2.0",
"dependencies": {
"@bazel/runfiles": "^6.5.0",
"jszip": "^3.10.1",
"tmp": "^0.2.5",
"ws": "^8.19.0"
},
"engines": {
"node": ">= 20.0.0"
}
},
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@ -5328,6 +5454,12 @@
"node": ">= 0.4"
}
},
"node_modules/setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
"license": "MIT"
},
"node_modules/sharp": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
@ -5490,6 +5622,40 @@
"is-arrayish": "^0.3.1"
}
},
"node_modules/sitemap": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz",
"integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==",
"license": "MIT",
"dependencies": {
"@types/node": "^24.9.2",
"@types/sax": "^1.2.1",
"arg": "^5.0.0",
"sax": "^1.4.1"
},
"bin": {
"sitemap": "dist/esm/cli.js"
},
"engines": {
"node": ">=20.19.5",
"npm": ">=10.8.2"
}
},
"node_modules/sitemap/node_modules/@types/node": {
"version": "24.12.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz",
"integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.16.0"
}
},
"node_modules/sitemap/node_modules/undici-types": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"license": "MIT"
},
"node_modules/slick-carousel": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
@ -5537,6 +5703,15 @@
"node": ">=10.0.0"
}
},
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/string-convert": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
@ -5769,7 +5944,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@ -5777,6 +5951,15 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/tmp": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
"integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
"license": "MIT",
"engines": {
"node": ">=14.14"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@ -5932,7 +6115,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -5964,7 +6146,6 @@
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT"
},
"node_modules/unrs-resolver": {
@ -6012,6 +6193,12 @@
"punycode": "^2.1.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@ -6127,6 +6314,49 @@
"node": ">=0.10.0"
}
},
"node_modules/ws": {
"version": "8.19.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/xml2js": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
"integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
"license": "MIT",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"license": "MIT",
"engines": {
"node": ">=4.0"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",

View File

@ -7,13 +7,15 @@
"build": "next build",
"start": "next start",
"export": "next export",
"lint": "eslint"
"lint": "eslint",
"sitemap": "node scripts/generate-sitemap.cjs",
"seo-audit": "node scripts/seo-test-selenium.cjs"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^7.2.0",
"@types/react-google-recaptcha": "2.1.9",
"aos": "^2.3.4",
"axios": "1.13.5",
"axios": "^1.13.5",
"bootstrap": "^5.3.8",
"gsap": "^3.14.2",
"isotope-layout": "^3.0.6",
@ -24,7 +26,10 @@
"react-google-recaptcha": "3.1.0",
"react-slick": "^0.31.0",
"sass": "^1.97.3",
"slick-carousel": "^1.8.1"
"selenium-webdriver": "^4.41.0",
"sitemap": "^9.0.1",
"slick-carousel": "^1.8.1",
"xml2js": "^0.6.2"
},
"devDependencies": {
"@types/aos": "^3.0.7",

7
public/robots.txt Normal file
View File

@ -0,0 +1,7 @@
# Allow all search engines to crawl all pages except these
User-agent: *
Disallow: /website-development-service/
Disallow: /mobile-app-development-service/
# Sitemap URL
Sitemap: https://metatroncubesolutions.com/sitemap.xml

1
public/sitemap.xml Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,151 @@
const fs = require('fs');
const { SitemapStream, streamToPromise } = require('sitemap');
const path = require('path');
const hostname = 'http://localhost:3000';
const addTrailingSlash = true; // ✅ Set this true if your Next.js uses trailingSlash: true
// // 🔧 Utility to format URLs based on config
// const formatUrl = (url) => {
// if (addTrailingSlash && !url.endsWith('/')) return url + '/';
// if (!addTrailingSlash && url.endsWith('/') && url !== '/') return url.slice(0, -1);
// return url;
// };
// Add a trailing slash only for “directory-like” URLs
const shouldAddSlash = (url) => {
// keep "/" as is
if (url === '/') return false;
// don't touch file-like URLs (has extension)
if (/\.[a-z0-9]{2,6}(\?.*)?$/i.test(url)) return false;
return true;
};
const formatUrl = (url) => {
// normalize to leading slash
if (!url.startsWith('/')) url = '/' + url;
if (addTrailingSlash && shouldAddSlash(url) && !url.endsWith('/')) {
return url + '/';
}
if (!addTrailingSlash && url.endsWith('/') && url !== '/') {
return url.slice(0, -1);
}
return url;
};
// ✅ Static pages
const staticLinks = [
{ url: '/', changefreq: 'daily', priority: 1.0 },
{ url: '/services-digital-solutions/', changefreq: 'daily', priority: 0.7 },
{ url: '/about/', changefreq: 'weekly', priority: 0.7 },
{ url: '/careers/', changefreq: 'weekly', priority: 0.7 },
{ url: '/portfolio/', changefreq: 'weekly', priority: 0.7 },
{ url: '/blog/', changefreq: 'weekly', priority: 0.7 },
{ url: '/contact/', changefreq: 'monthly', priority: 0.5 },
{ url: '/faq/', changefreq: 'monthly', priority: 0.5 },
{ url: '/service/website-development-company/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/mobile-application-development/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/graphic-designing-company/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/ui-ux-designing/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/search-engine-optimization-seo-content-writing/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/digital-marketing-agency-in-canada/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/app-development-waterloo/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/kitchener-waterloo-website-design-services/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/professional-website-designers-in-waterloo/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/waterloo-seo-services/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/web-design-toronto-custom-website-creation-by-metatroncube-software-solutions/', changefreq: 'weekly', priority: 0.6 },
{ url: '/service/web-page-design-in-waterloo/', changefreq: 'weekly', priority: 0.6 },
];
// ✅ Dynamic blog posts
const blogPosts = [
{ slug: '5-tips-to-create-viral-content-that-drives-engagement' },
{ slug: 'instagram-vs-facebook-choosing-the-right-platform-for-your-business' },
{ slug: 'how-local-seo-can-drive-more-foot-traffic-to-your-business' },
{ slug: 'on-page-vs-off-page-seo-what-every-business-owner-needs-to-know' },
{ slug: 'how-to-create-a-winning-digital-marketing-strategy-for-your-business' },
{ slug: 'white-hat-vs-black-hat-seo-an-in-depth-link-building-guide' },
{ slug: 'how-to-boost-your-small-business-with-effective-digital-marketing-strategies' },
{ slug: 'the-importance-of-local-seo-for-real-estate-agents' },
{ slug: 'how-to-optimize-your-website-for-voice-search' },
{ slug: 'how-ai-is-revolutionizing-web-development-and-seo' },
{ slug: 'top-digital-marketing-agency-in-canada-metatroncube-software-solutions' },
{ slug: 'best-digital-marketing-company-in-canada-metatroncube-solutions' },
{ slug: 'web-designers-for-small-business' },
{ slug: 'mobile-commerce-2024-web-app-development-evolution' },
{ slug: 'how-to-personalize-cold-emails-without-spending-hours-on-research' },
{ slug: 'how-to-overcome-the-biggest-challenges-in-cold-emailing-b2b-success' },
{ slug: '9-powerful-free-google-tools-to-grow-your-business' },
{ slug: '5-digital-marketing-mistakes-every-small-business-must-avoid' },
{ slug: 'how-digital-solutions-drove-success-for-a-local-business' },
{ slug: 'ai-driven-seo-how-to-future-proof-your-search-strategy' },
{ slug: 'mastering-omnichannel-marketing-strategies-for-2026' },
{ slug: 'how-metatroncube-solutions-improve-local-seo-waterloo' },
{ slug: 'why-metatroncube-solutions-top-choice-social-media-marketing-waterloo' },
{ slug: 'how-does-metatroncube-solutions-help-businesses-get-more-local-customers-through-search-engines' },
{ slug: 'can-metatroncube-solutions-optimize-my-google-business-profile' },
{ slug: 'seo-services-waterloo-small-businesses-metatroncube' },
{ slug: 'boost-google-maps-ranking-waterloo-metatroncube' },
{ slug: 'how-metatroncube-solutions-uses-ai-tools-to-boost-your-marketing-in-toronto' },
{ slug: 'what-types-of-social-media-ads-does-metatroncube-solutions-recommend-for-small-businesses-in-toronto' },
{ slug: 'should-i-run-facebook-or-google-ads-for-my-business-and-can-metatroncube-solutions-manage-them' },
{ slug: 'is-metatroncube-solutions-the-best-ppc-agency-in-waterloo' },
{ slug: 'how-can-metatroncube-solutions-help-me-get-more-followers-for-my-local-business' },
{ slug: 'how-to-track-roi-from-your-website-and-marketing-campaigns-with-metatroncube-solutions' },
{ slug: 'does-metatroncube-solutions-provide-ai-powered-marketing-solutions-for-local-businesses-in-waterloo' },
{ slug: 'how-can-i-track-roi-from-my-website-and-marketing-campaigns-with-metatroncube-solutions-in-waterloo' },
{ slug: 'can-metatroncube-solutions-manage-my-social-media-campaigns-from-start-to-finish' },
{ slug: 'does-metatroncube-solutions-provide-website-audits-for-small-businesses' },
{ slug: 'can-metatroncube-solutions-handle-both-seo-and-ppc-campaigns-for-my-business-in-waterloo' },
{ slug: 'what-types-of-social-media-ads-does-metatroncube-solutions-recommend-for-small-businesses-in-waterloo' },
{ slug: 'driving-digital-growth-with-metatroncubes-performance-focused-marketing-strategies' },
{ slug: 'how-metatroncube-helps-businesses-scale-faster-with-smart-digital-solutions' },
{ slug: 'building-powerful-digital-brands-with-metatroncube-creative-technical-expertise' },
{ slug: 'professional-digital-marketing-services-in-canada-for-sustainable-business-growth' },
{ slug: 'custom-website-development-solutions-in-canada-for-modern-businesses' },
{ slug: 'is-metatroncube-solutions-the-top-choice-for-social-media-marketing-in-waterloo' },
{ slug: 'how-can-metatroncube-solutions-improve-mobile-ux-for-my-business-website' },
{ slug: 'is-metatroncube-solutions-a-good-agency-for-website-redesign-in-waterloo' },
{ slug: 'does-metatroncube-solutions-provide-website-audits-for-small-businesses' },
{ slug: 'seo-for-small-businesses-waterloo' },
{ slug: 'modern-business-website-features-waterloo' },
{ slug: 'why-social-media-management-important-business' },
{ slug: 'why-you-need-digital-marketing-agency-business-growth' },
];
// Convert blog slugs to sitemap entries
const blogLinks = blogPosts.map(post => ({
url: `/${post.slug}`,
changefreq: 'weekly',
priority: 0.6
}));
const allLinks = [...staticLinks, ...blogLinks].map(link => ({
...link,
url: formatUrl(link.url),
}));
async function generateSitemap() {
try {
const sitemap = new SitemapStream({ hostname: hostname });
const writeStream = fs.createWriteStream(path.resolve(__dirname, '../public/sitemap.xml'));
sitemap.pipe(writeStream);
console.log('📦 Writing URLs to sitemap:');
allLinks.forEach(link => {
console.log(' -', hostname + link.url);
sitemap.write(link);
});
sitemap.end();
await streamToPromise(sitemap);
console.log('✅ sitemap.xml created successfully!');
} catch (error) {
console.error('❌ Error creating sitemap.xml:', error);
}
}
generateSitemap();

View File

@ -0,0 +1,43 @@
Page URL,Image Src,Alt Text,Issue Type
"http://localhost:3000/","http://localhost:3000/assets/images/home/2/left-img.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/images/home/3/right-img.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-1.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-2.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-3.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-4.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-1.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-2.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-3.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-4.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-1.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-2.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-3.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-4.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-1.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-2.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-3.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/add/icon-4.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/images/home/4/lets-discuss.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/images/about/6/left.webp","(empty)","Empty Alt"
"http://localhost:3000/","http://localhost:3000/assets/img/logo.webp","(empty)","Empty Alt"
"http://localhost:3000/","","img","Duplicate Alt (3 times)"
"http://localhost:3000/","","pelocis","Duplicate Alt (3 times)"
"http://localhost:3000/","","shape","Duplicate Alt (6 times)"
"http://localhost:3000/","","icon","Duplicate Alt (18 times)"
"http://localhost:3000/","","Digital Marketing","Duplicate Alt (2 times)"
"http://localhost:3000/","","Website Development","Duplicate Alt (2 times)"
"http://localhost:3000/","","sureshkumar natarajan","Duplicate Alt (2 times)"
"http://localhost:3000/","","VINOD G","Duplicate Alt (2 times)"
"http://localhost:3000/","","Dine360 Ads","Duplicate Alt (2 times)"
"http://localhost:3000/","","Arun kumar","Duplicate Alt (2 times)"
"http://localhost:3000/services-digital-solutions/","http://localhost:3000/assets/images/services/choose/grid.webp","(empty)","Empty Alt"
"http://localhost:3000/services-digital-solutions/","http://localhost:3000/assets/images/services/service/element-small.webp","(empty)","Empty Alt"
"http://localhost:3000/services-digital-solutions/","http://localhost:3000/assets/images/services/deliver/element.webp","(empty)","Empty Alt"
"http://localhost:3000/services-digital-solutions/","http://localhost:3000/assets/images/services/journey/element-2.webp","(empty)","Empty Alt"
"http://localhost:3000/services-digital-solutions/","http://localhost:3000/assets/img/logo.webp","(empty)","Empty Alt"
"http://localhost:3000/services-digital-solutions/","","Comprehensive digital development","Duplicate Alt (3 times)"
"http://localhost:3000/services-digital-solutions/","","Strategic online growth solutions","Duplicate Alt (3 times)"
"http://localhost:3000/services-digital-solutions/","","Creative design and branding excellence","Duplicate Alt (3 times)"
"http://localhost:3000/services-digital-solutions/","","icon","Duplicate Alt (9 times)"
"http://localhost:3000/services-digital-solutions/","","img","Duplicate Alt (3 times)"
"http://localhost:3000/services-digital-solutions/","","shape","Duplicate Alt (3 times)"
1 Page URL Image Src Alt Text Issue Type
2 http://localhost:3000/ http://localhost:3000/assets/images/home/2/left-img.webp (empty) Empty Alt
3 http://localhost:3000/ http://localhost:3000/assets/images/home/3/right-img.webp (empty) Empty Alt
4 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-1.webp (empty) Empty Alt
5 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-2.webp (empty) Empty Alt
6 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-3.webp (empty) Empty Alt
7 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-4.webp (empty) Empty Alt
8 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-1.webp (empty) Empty Alt
9 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-2.webp (empty) Empty Alt
10 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-3.webp (empty) Empty Alt
11 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-4.webp (empty) Empty Alt
12 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-1.webp (empty) Empty Alt
13 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-2.webp (empty) Empty Alt
14 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-3.webp (empty) Empty Alt
15 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-4.webp (empty) Empty Alt
16 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-1.webp (empty) Empty Alt
17 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-2.webp (empty) Empty Alt
18 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-3.webp (empty) Empty Alt
19 http://localhost:3000/ http://localhost:3000/assets/img/add/icon-4.webp (empty) Empty Alt
20 http://localhost:3000/ http://localhost:3000/assets/images/home/4/lets-discuss.webp (empty) Empty Alt
21 http://localhost:3000/ http://localhost:3000/assets/images/about/6/left.webp (empty) Empty Alt
22 http://localhost:3000/ http://localhost:3000/assets/img/logo.webp (empty) Empty Alt
23 http://localhost:3000/ img Duplicate Alt (3 times)
24 http://localhost:3000/ pelocis Duplicate Alt (3 times)
25 http://localhost:3000/ shape Duplicate Alt (6 times)
26 http://localhost:3000/ icon Duplicate Alt (18 times)
27 http://localhost:3000/ Digital Marketing Duplicate Alt (2 times)
28 http://localhost:3000/ Website Development Duplicate Alt (2 times)
29 http://localhost:3000/ sureshkumar natarajan Duplicate Alt (2 times)
30 http://localhost:3000/ VINOD G Duplicate Alt (2 times)
31 http://localhost:3000/ Dine360 Ads Duplicate Alt (2 times)
32 http://localhost:3000/ Arun kumar Duplicate Alt (2 times)
33 http://localhost:3000/services-digital-solutions/ http://localhost:3000/assets/images/services/choose/grid.webp (empty) Empty Alt
34 http://localhost:3000/services-digital-solutions/ http://localhost:3000/assets/images/services/service/element-small.webp (empty) Empty Alt
35 http://localhost:3000/services-digital-solutions/ http://localhost:3000/assets/images/services/deliver/element.webp (empty) Empty Alt
36 http://localhost:3000/services-digital-solutions/ http://localhost:3000/assets/images/services/journey/element-2.webp (empty) Empty Alt
37 http://localhost:3000/services-digital-solutions/ http://localhost:3000/assets/img/logo.webp (empty) Empty Alt
38 http://localhost:3000/services-digital-solutions/ Comprehensive digital development Duplicate Alt (3 times)
39 http://localhost:3000/services-digital-solutions/ Strategic online growth solutions Duplicate Alt (3 times)
40 http://localhost:3000/services-digital-solutions/ Creative design and branding excellence Duplicate Alt (3 times)
41 http://localhost:3000/services-digital-solutions/ icon Duplicate Alt (9 times)
42 http://localhost:3000/services-digital-solutions/ img Duplicate Alt (3 times)
43 http://localhost:3000/services-digital-solutions/ shape Duplicate Alt (3 times)

View File

@ -0,0 +1,266 @@
// 🚀 Full SEO + Broken Link + 404 + Accessibility + Image Alt CSV Export
// Run with: node seo_full_audit.js
const { Builder, By } = require("selenium-webdriver");
const chrome = require("selenium-webdriver/chrome");
const axios = require("axios");
const xml2js = require("xml2js");
const fs = require("fs");
const path = require("path");
// CSV file for Image Alt issues
const csvPath = path.join(__dirname, "image_alt_issues.csv");
fs.writeFileSync(csvPath, "Page URL,Image Src,Alt Text,Issue Type\n", "utf8");
// ==========================
// 1⃣ Fetch URLs from sitemap.xml
// ==========================
async function getUrlsFromSitemap(sitemapUrl) {
try {
const res = await axios.get(sitemapUrl);
const parsed = await xml2js.parseStringPromise(res.data);
return parsed.urlset.url.map((u) => u.loc[0]);
} catch (err) {
console.error("❌ Failed to load sitemap:", err.message);
return [];
}
}
// ==========================
// 2⃣ Check HTTP Status
// ==========================
async function checkLinkStatus(url) {
try {
const res = await axios.get(url, {
timeout: 10000,
validateStatus: () => true,
});
if (
res.status === 200 &&
(
/404/i.test(res.data.match(/<title[^>]*>(.*?)<\/title>/)?.[1] ?? "")
)
) {
return "Soft 404";
}
return res.status;
} catch (err) {
return err.response ? err.response.status : "❌ No Response";
}
}
// ==========================
// 3⃣ Main SEO + Accessibility + Image Alt Audit
// ==========================
async function checkSEO(url, siteDomain) {
const options = new chrome.Options();
options.addArguments("--headless", "--no-sandbox", "--disable-gpu");
const driver = await new Builder()
.forBrowser("chrome")
.setChromeOptions(options)
.build();
try {
const pageStatus = await checkLinkStatus(url);
if (pageStatus === 404 || pageStatus === "Soft 404") {
console.log(`\n🚫 ${url} → ❌ Page not found (${pageStatus})`);
return;
}
await driver.get(url);
const pageSource = await driver.getPageSource();
// Basic SEO Elements
const title = await driver.getTitle();
const descElem = await driver.findElements(By.css('meta[name="description"]'));
const canonicalElem = await driver.findElements(By.css('link[rel="canonical"]'));
const robotsElem = await driver.findElements(By.css('meta[name="robots"]'));
const viewportElem = await driver.findElements(By.css('meta[name="viewport"]'));
const charset = await driver.findElements(By.css('meta[charset]'));
const htmlTag = await driver.findElement(By.css("html"));
const langAttr = await htmlTag.getAttribute("lang").catch(() => "");
const h1Tags = await driver.findElements(By.css("h1"));
const h2Tags = await driver.findElements(By.css("h2"));
// Meta Description
let descContent = descElem.length > 0 ? await descElem[0].getAttribute("content") : "";
const descLength = descContent.length;
const descStatus =
descLength === 0
? "❌ Missing"
: descLength < 50
? `⚠️ Too short (${descLength})`
: descLength > 160
? `⚠️ Too long (${descLength})`
: "✅ Perfect";
// Title length check
const titleLength = title.length;
const titleStatus =
titleLength === 0
? "❌ Missing"
: titleLength < 30
? `⚠️ Too short (${titleLength})`
: titleLength > 65
? `⚠️ Too long (${titleLength})`
: "✅ Perfect";
// Canonical
const canonicalURL =
canonicalElem.length > 0 ? await canonicalElem[0].getAttribute("href") : "❌ Missing";
// 🖼️ Image Accessibility Audit
const imgs = await driver.findElements(By.css("img"));
let missingAlt = 0;
let emptyAlt = 0;
let duplicateAlt = [];
const altTextMap = new Map();
for (const img of imgs) {
const src = await img.getAttribute("src");
const alt = (await img.getAttribute("alt"))?.trim() ?? null;
if (alt === null) {
missingAlt++;
fs.appendFileSync(csvPath, `"${url}","${src}","","Missing Alt"\n`, "utf8");
continue;
}
if (alt === "") {
emptyAlt++;
fs.appendFileSync(csvPath, `"${url}","${src}","(empty)","Empty Alt"\n`, "utf8");
}
if (altTextMap.has(alt)) {
altTextMap.set(alt, altTextMap.get(alt) + 1);
} else {
altTextMap.set(alt, 1);
}
}
for (const [altText, count] of altTextMap.entries()) {
if (altText && count > 1) {
duplicateAlt.push({ altText, count });
fs.appendFileSync(
csvPath,
`"${url}","","${altText}","Duplicate Alt (${count} times)"\n`,
"utf8"
);
}
}
// Detect tracking & schema tags
const hasGTM = pageSource.includes("googletagmanager.com/gtm.js");
const hasClarity = pageSource.includes("clarity.ms/tag");
const hasFBPixel = pageSource.includes("fbevents.js") || pageSource.includes("fbq(");
const hasAnalytics = pageSource.includes("www.googletagmanager.com/gtag/js");
const ogTags = await driver.findElements(By.css("meta[property^='og:']"));
const twitterTags = await driver.findElements(By.css("meta[name^='twitter:']"));
const schemaScripts = await driver.findElements(By.css('script[type="application/ld+json"]'));
// Links check
const anchorTags = await driver.findElements(By.css("a[href]"));
const brokenLinks = [];
for (const a of anchorTags) {
const href = await a.getAttribute("href");
if (!href || href.startsWith("#") || href.startsWith("mailto:")) continue;
const fullUrl = href.startsWith("http")
? href
: `${siteDomain}${href.startsWith("/") ? href : `/${href}`}`;
if (fullUrl.includes(siteDomain)) {
const status = await checkLinkStatus(fullUrl);
if (status === 404 || status === "Soft 404" || status === "❌ No Response") {
brokenLinks.push({ link: fullUrl, status });
}
}
}
// Lazy loading check
const images = await driver.findElements(By.css("img, video, iframe"));
const lazyLoadCount = await Promise.all(
images.map(async (img) => {
const loading = await img.getAttribute("loading");
return loading === "lazy";
})
);
const lazyLoaded = lazyLoadCount.filter((v) => v).length;
// Console Summary
console.log(`\n🔍 Checking: ${url}`);
console.log("-------------------------------------------");
console.log("Title:", titleStatus);
console.log("Meta Description:", descStatus);
console.log("Canonical URL:", canonicalURL);
console.log("Meta Robots:", robotsElem.length > 0 ? "✅ Found" : "⚠️ Missing");
console.log("Viewport:", viewportElem.length > 0 ? "✅ Found" : "⚠️ Missing");
console.log("Charset:", charset.length > 0 ? "✅ Found" : "❌ Missing");
console.log("HTML lang:", langAttr ? `${langAttr}` : "⚠️ Missing");
console.log("H1 Tags:", h1Tags.length > 0 ? `${h1Tags.length}` : "❌ Missing");
console.log("H2 Tags:", h2Tags.length > 0 ? ` ${h2Tags.length}` : "⚠️ None");
console.log("Images:", imgs.length);
console.log(
"Missing Alt:",
missingAlt > 0 ? `${missingAlt}` : "✅ None"
);
console.log(
"Empty Alt:",
emptyAlt > 0 ? `⚠️ ${emptyAlt}` : "✅ None"
);
console.log(
"Duplicate Alt:",
duplicateAlt.length > 0 ? `⚠️ ${duplicateAlt.length}` : "✅ None"
);
console.log("Lazy Loaded Images:", lazyLoaded > 0 ? `${lazyLoaded}` : "⚠️ None");
console.log("Open Graph Tags:", ogTags.length > 0 ? "✅ Found" : "⚠️ Missing");
console.log("Twitter Tags:", twitterTags.length > 0 ? "✅ Found" : "⚠️ Missing");
console.log("Schema Markup:", schemaScripts.length > 0 ? "✅ Found" : "⚠️ Missing");
console.log("Google Analytics:", hasAnalytics ? "✅ Found" : "⚠️ Missing");
console.log("GTM:", hasGTM ? "✅ Found" : "⚠️ Missing");
console.log("Clarity:", hasClarity ? "✅ Found" : "⚠️ Missing");
console.log("Facebook Pixel:", hasFBPixel ? "✅ Found" : "⚠️ Missing");
if (brokenLinks.length > 0) {
console.log("\n❌ Broken Links:");
brokenLinks.forEach((b) => console.log(`${b.link} [${b.status}]`));
} else {
console.log("✅ No broken links found.");
}
} catch (err) {
console.error(`❌ Error on ${url}:`, err.message);
} finally {
await driver.quit();
}
}
// ==========================
// 4⃣ Run Full Site Audit
// ==========================
(async () => {
const sitemapUrl = "http://localhost:3000/sitemap.xml";
const siteDomain = "http://localhost:3000";
console.log("📄 Fetching URLs from sitemap...");
const urls = await getUrlsFromSitemap(sitemapUrl);
if (urls.length === 0) {
console.error("❌ No URLs found in sitemap.");
return;
}
console.log(`✅ Found ${urls.length} URLs in sitemap.`);
console.log("🚀 Starting Full SEO + Accessibility + Broken Link Audit...");
for (const url of urls) {
await checkSEO(url, siteDomain);
}
console.log("\n✅ Full SEO Audit Completed!");
console.log(` CSV Report: ${csvPath}`);
})();

View File

@ -1,48 +1,30 @@
"use client";
import React, { useEffect } from "react";
import Header2 from "@/components/layout/Header2";
import Footer2 from "@/components/layout/Footer2";
import InnerBanner from "@/components/common/InnerBanner";
import FeaturesSection from "@/components/home/home-2/FeaturesSection";
import About2Section from "@/components/home/home-2/About2Section";
import WhyChooseUs from "@/components/about/WhyChooseUs";
import ServiceTabSection from "@/components/home/home-2/ServiceTabSection";
import WorkProcessSection from "@/components/home/home-2/WorkProcessSection";
import TextSliderSection from "@/components/home/home-2/TextSliderSection";
import ProjectSlider2Section from "@/components/home/home-2/ProjectSlider2Section";
import TestimonialsSection from "@/components/home/home-1/TestimonialsSection";
import IconCounterSection from "@/components/home/home-2/IconCounterSection";
import HelpFormSection from "@/components/home/home-2/HelpFormSection";
import Blog2Section from "@/components/home/home-2/Blog2Section";
import BrandSection from "@/components/home/home-1/BrandSection";
import ChooseSection from "@/components/home/home-1/ChooseSection";
import FaqSection from "@/components/home/home-3/FaqSection";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import OfferSection from "@/components/home/OfferSection";
import WhyChooseSection from "@/components/careers/WhyChooseSection";
import PageHeader from "@/components/common/PageHeader";
import HistoryTwo from "@/components/home/HistoryTwo";
import About2Section from "@/components/home/home-2/About2Section";
import WhyChooseTwo from "@/components/home/WhyChooseTwo";
import HistoryTwo from "@/components/home/HistoryTwo";
import BrandSection from "@/components/home/home-1/BrandSection";
import TestimonialsSection from "@/components/home/home-1/TestimonialsSection";
import ContactSection from "@/components/careers/ContactSection";
import CouterAreaThree from "@/components/home/CounterAreaThree";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "About - Metatroncube Software Solutions | Innovative & User-Centric Tech Services in Waterloo",
description: "Metatroncube Software Solutions: Pioneering custom web & mobile apps since 2019. Based in Waterloo, we deliver innovative, user-centric digital products that power your growth.",
alternates: {
canonical: "/about-us",
},
};
export default function Home2() {
useEffect(() => {
const init = () => {
if (typeof window !== "undefined" && (window as any).initMetatron && (window as any).jQuery) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader
@ -50,33 +32,13 @@ export default function Home2() {
bannerLeftImage="/assets/images/innerbanner/left/left-about.webp"
bannerRightImage="/assets/images/innerbanner/right/right-about.webp"
/>
{/* <FeaturesSection /> */}
<About2Section />
{/* <CounterAreaTwo /> */}
<CouterAreaThree />
{/* <IconCounterSection /> */}
<WhyChooseTwo />
{/* <HelpFormSection /> */}
{/* <WhyChooseSection /> */}
{/* <WhyChooseUs /> */}
{/* <ServiceTabSection /> */}
{/* <OfferSection/> */}
{/* <TextSliderSection /> */}
{/* <WorkProcessSection /> */}
<HistoryTwo />
<BrandSection />
<TestimonialsSection />
<ContactSection />
{/* <FaqSection /> */}
{/* <ServiceTabSection /> */}
{/* <ProjectSlider2Section /> */}
{/* <TestimonialsSection /> */}
{/* <IconCounterSection /> */}
{/* <Blog2Section /> */}
</main>
<Footer1 />
</>

View File

@ -1,9 +1,22 @@
import React from "react";
import { BlogData } from "@/utils/constant.utils";
import BlogDetailsClient from "./BlogDetailsClient";
import { Metadata } from "next";
const blogs = BlogData;
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
const { slug } = await params;
const blog = blogs.find((b) => b.slug === slug);
return {
title: blog?.metatitle || blog?.title || "Blog Details",
description: blog?.metaDisc || blog?.description || "Read more on Metatroncube blog.",
alternates: {
canonical: `/blog/${slug}`,
},
};
}
export async function generateStaticParams() {
return blogs.map((blog) => ({

View File

@ -1,21 +1,23 @@
"use client";
import React, { useEffect } from "react";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import BlogSection from "@/components/home/home-1/BlogSection";
import PageHeader from "@/components/common/PageHeader";
import SectionTitle from "@/components/common/SectionTitle";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Top 5 SEO Trends for 2025 | Metatroncube",
description: "Explore the latest SEO strategies for 2025. Stay ahead with insights from Metatroncube Software Solutions.",
alternates: {
canonical: "/blog",
},
};
export default function BlogPage() {
useEffect(() => {
if (typeof window !== "undefined" && (window as any).initMetatron) {
(window as any).initMetatron();
}
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader
@ -23,21 +25,6 @@ export default function BlogPage() {
bannerLeftImage="/assets/images/innerbanner/left/left-blog.webp"
bannerRightImage="/assets/images/innerbanner/right/right-blog.webp"
/>
{/* <div className="container section-space-top">
<SectionTitle
tagline="LATEST NEWS"
title="Latest Blog & News"
centered={true}
/>
<div className="row justify-content-center">
<div className="col-lg-8 text-center pt-20">
<p className="sec-text">
Stay updated with our latest industry insights, success stories, and technical guides.
We share our expertise to help your business grow and stay ahead in the digital landscape.
</p>
</div>
</div>
</div> */}
<BlogSection hideHeader={true} isPaginated={true} />
</main>
<Footer1 />

View File

@ -1,49 +1,35 @@
"use client";
import React, { useEffect } from "react";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import InnerBanner from "@/components/common/InnerBanner";
import AboutOneSection from "@/components/careers/AboutOneSection";
import WhyChooseUs from "@/components/about/WhyChooseUs";
import FaqVideoSection from "@/components/careers/FaqVideoSection";
import ContactSection from "@/components/careers/ContactSection";
import ServiceSection from "@/components/careers/ServiceSection";
import WorkProcessSection from "@/components/careers/WorkProcessSection";
import FeaturesSection from "@/components/home/home-1/FeaturesSection";
import PageHeader from "@/components/common/PageHeader";
import AboutService from "@/components/services-digital-solutions/AboutService";
import AboutThree from "@/components/home/AboutThree";
import FaqFour from "@/components/home/FaqFour";
import ProjectsSection from "@/components/home/ProjectsSection";
import WhyChooseSection from "@/components/careers/WhyChooseSection";
import ContactSection from "@/components/careers/ContactSection";
import FaqVideoSection from "@/components/careers/FaqVideoSection";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Careers - Metatroncube Software Solutions | Innovative & User-Centric Tech Services in Waterloo",
description: "Join MetatronCube — where innovation in web & mobile development, SEO, and digital marketing meets your growth. Explore careers and build the future with us.",
alternates: {
canonical: "/careers",
},
};
export default function CareersPage() {
useEffect(() => {
if (typeof window !== "undefined" && (window as any).initMetatron) {
(window as any).initMetatron();
}
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader
title="Careers"
bannerLeftImage="/assets/images/innerbanner/left/left-career.webp"
bannerRightImage="/assets/images/innerbanner/right/right-careers.webp"
bannerRightImage="/assets/images/innerbanner/right/right-career.webp"
/>
<AboutService />
{/* <AboutOneSection /> */}
<AboutThree />
<WhyChooseUs />
<ProjectsSection />
{/* <FaqVideoSection /> */}
{/* <ContactSection /> */}
{/* <FeaturesSection /> */}
{/* <ServiceSection /> */}
{/* <FaqFour /> */}
{/* <WorkProcessSection /> */}
<WhyChooseSection />
<FaqVideoSection />
<ContactSection />
</main>
<Footer1 />
</>

View File

@ -1,27 +1,24 @@
"use client";
import React, { useEffect } from "react";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import InnerBanner from "@/components/common/InnerBanner";
import ContactSection from "@/components/contact/ContactSection";
import MapSection from "@/components/contact/MapSection";
import PageHeader from "@/components/common/PageHeader";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Contact - Metatroncube Software Solutions | Innovative & User-Centric Tech Services in Waterloo",
description: "Let's Connect. Drop us a Line. Whether you have a question, a project idea, or just want to chat, we're here for you.",
alternates: {
canonical: "/contact",
},
};
export default function ContactPage() {
useEffect(() => {
const init = () => {
if (typeof window !== "undefined" && (window as any).initMetatron && (window as any).jQuery) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader

View File

@ -1,30 +1,26 @@
"use client";
import React, { useEffect } from "react";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import InnerBanner from "@/components/common/InnerBanner";
import FaqPageSection from "@/components/faq/FaqPageSection";
import FaqVideoSection from "@/components/careers/FaqVideoSection";
import PageHeader from "@/components/common/PageHeader";
import FaqSection from "@/components/home/home-3/FaqSection";
import FaqFour from "@/components/home/FaqFour";
import FaqFive from "@/components/home/FaqFive";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Web & App Development, SEO, Marketing FAQs | Metatroncube",
description: "Explore FAQs about Web & App Development, SEO, digital marketing, and graphic design. Uncover expert insights and solutions with Metatroncube.",
alternates: {
canonical: "/faq",
},
};
export default function FaqPage() {
useEffect(() => {
const init = () => {
if (typeof window !== "undefined" && (window as any).initMetatron && (window as any).jQuery) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader
@ -36,7 +32,6 @@ export default function FaqPage() {
<FaqFour />
<FaqFive />
<FaqVideoSection />
{/* <FaqSection/> */}
</main>
<Footer1 />
</>

View File

@ -9,47 +9,182 @@ import SearchOverlay from "@/components/common/SearchOverlay";
import Offcanvas from "@/components/common/Offcanvas";
export const metadata: Metadata = {
title: "Metatroncube - IT Solutions & Technology",
description: "IT Solutions & Technology",
metadataBase: new URL("https://metatroncubesolutions.com"),
title: "Metatroncube: Leaders in Web &amp; Mobile Dev, SEO, Digital Marketing",
description: "Metatroncube Software Solutions: Your go-to agency for cutting-edge web &amp; app development, SEO, digital marketing, and graphic design services",
robots: {
index: true,
follow: true,
},
};
export default function RootLayout({
children,
children,
}: {
children: React.ReactNode;
children: React.ReactNode;
}) {
return (
<html lang="en">
<head>
<link rel="stylesheet" href="/assets/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/meanmenu.min.css" />
<link rel="stylesheet" href="/assets/css/animate.css" />
<link rel="stylesheet" href="/assets/css/swiper.min.css" />
<link rel="stylesheet" href="/assets/css/slick.css" />
<link rel="stylesheet" href="/assets/css/magnific-popup.css" />
<link rel="stylesheet" href="/assets/css/fontawesome-pro.css" />
<link rel="stylesheet" href="/assets/css/icomoon.css" />
<link rel="stylesheet" href="/assets/css/spacing.css" />
<link rel="stylesheet" href="/assets/css/main.css" />
</head>
<body>
<Preloader />
<BackToTop />
<SearchOverlay />
<Offcanvas />
{children}
return (
<html lang="en">
<head>
<Script src="/assets/js/jquery-3.7.1.min.js" strategy="beforeInteractive" />
<Script src="/assets/js/waypoints.min.js" strategy="afterInteractive" />
<Script src="/assets/js/bootstrap.bundle.min.js" strategy="afterInteractive" />
<Script src="/assets/js/meanmenu.min.js" strategy="afterInteractive" />
<Script src="/assets/js/swiper.min.js" strategy="afterInteractive" />
<Script src="/assets/js/slick.min.js" strategy="afterInteractive" />
<Script src="/assets/js/magnific-popup.min.js" strategy="afterInteractive" />
<Script src="/assets/js/counterup.js" strategy="afterInteractive" />
<Script src="/assets/js/wow.js" strategy="afterInteractive" />
<Script src="/assets/js/main.js" strategy="afterInteractive" />
</body>
</html>
);
}
{/* CSS */}
<link rel="stylesheet" href="/assets/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/meanmenu.min.css" />
<link rel="stylesheet" href="/assets/css/animate.css" />
<link rel="stylesheet" href="/assets/css/swiper.min.css" />
<link rel="stylesheet" href="/assets/css/slick.css" />
<link rel="stylesheet" href="/assets/css/magnific-popup.css" />
<link rel="stylesheet" href="/assets/css/fontawesome-pro.css" />
<link rel="stylesheet" href="/assets/css/icomoon.css" />
<link rel="stylesheet" href="/assets/css/spacing.css" />
<link rel="stylesheet" href="/assets/css/main.css" />
{/* ✅ Google Tag Manager (script) */}
<script
dangerouslySetInnerHTML={{
__html: `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-KWXS2ZM3');`,
}}
/>
{/* ✅ Google Analytics (gtag.js) */}
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-1NXE8QSBC8"
></script>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-1NXE8QSBC8');
`,
}}
/>
{/* Metatron Cube Solutions Schema Markup */}
<Script
id="schema-metatron"
type="application/ld+json"
strategy="afterInteractive"
>
{JSON.stringify({
"@context": "https://schema.org",
"@type": "Organization",
name: "Metatroncube Solutions",
alternateName: "Metatron Digital Agency",
url: "https://metatroncubesolutions.com/",
logo: "https://metatroncubesolutions.com/assets/images/logo.webp",
image: "https://metatroncubesolutions.com/assets/images/logo.webp",
description:
"Metatroncube Software Solutions: Your go-to agency for cutting-edge web &amp; app development, SEO, digital marketing, and graphic design services.",
telephone: "+1-647-679-7651",
address: {
"@type": "PostalAddress",
streetAddress: "Waterloo, Ontario",
addressLocality: "Waterloo",
addressRegion: "ON",
postalCode: "N2L",
addressCountry: "CA",
},
openingHoursSpecification: [
{
"@type": "OpeningHoursSpecification",
dayOfWeek: [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
],
opens: "08:00",
closes: "18:00",
},
{
"@type": "OpeningHoursSpecification",
dayOfWeek: "Sunday",
opens: "00:00",
closes: "00:00",
closed: true,
},
],
sameAs: [
"https://www.facebook.com/metatroncubecanada",
"https://instagram.com/metatron_digitalagency",
"https://x.com/MetatroncubeDA",
"https://www.linkedin.com/company/metatroncube-software-solutions/",
"https://www.youtube.com/@metatron_digitalagency",
],
contactPoint: [
{
"@type": "ContactPoint",
telephone: "+1-647-679-7651",
contactType: "customer service",
areaServed: "CA",
availableLanguage: ["English"],
},
],
})}
</Script>
</head>
<body>
{/* ✅ GTM noscript */}
<noscript>
<iframe
src="https://www.googletagmanager.com/ns.html?id=GTM-KWXS2ZM3"
height="0"
width="0"
style={{ display: 'none', visibility: 'hidden' }}
></iframe>
</noscript>
<Preloader />
<BackToTop />
<SearchOverlay />
<Offcanvas />
{children}
{/* JS */}
<Script src="/assets/js/jquery-3.7.1.min.js" strategy="beforeInteractive" />
<Script src="/assets/js/waypoints.min.js" strategy="afterInteractive" />
<Script src="/assets/js/bootstrap.bundle.min.js" strategy="afterInteractive" />
<Script src="/assets/js/meanmenu.min.js" strategy="afterInteractive" />
<Script src="/assets/js/swiper.min.js" strategy="afterInteractive" />
<Script src="/assets/js/slick.min.js" strategy="afterInteractive" />
<Script src="/assets/js/magnific-popup.min.js" strategy="afterInteractive" />
<Script src="/assets/js/counterup.js" strategy="afterInteractive" />
<Script src="/assets/js/wow.js" strategy="afterInteractive" />
<Script src="/assets/js/main.js" strategy="afterInteractive" />
{/* ✅ accessiBe script */}
<script
dangerouslySetInnerHTML={{
__html: `
(function(){
var s = document.createElement('script');
var h = document.querySelector('head') || document.body;
s.src = 'https://acsbapp.com/apps/app/dist/js/app.js';
s.async = true;
s.onload = function(){
if (typeof acsbJS !== 'undefined') {
acsbJS.init();
}
};
h.appendChild(s);
})();
`,
}}
/>
</body>
</html>
);
}

View File

@ -1,4 +1,5 @@
import React from "react";
import type { Metadata } from "next";
import MainLayout from "@/components/mobile-app-development-service/support/layout/MainLayout";
import Hero from "@/components/mobile-app-development-service/Hero";
import BannerBottom from "@/components/mobile-app-development-service/BannerBottom";
@ -14,6 +15,14 @@ import Testimonial from "@/components/mobile-app-development-service/Testimonial
import FAQ from "@/components/mobile-app-development-service/FAQ";
import "@/components/mobile-app-development-service/style-app.css";
export const metadata: Metadata = {
title: "Mobile App Development Services | Metatroncube",
description: "Transform your ideas into powerful mobile applications for iOS and Android. Our expert developers create user-centric apps that deliver results.",
alternates: {
canonical: "/mobile-app-development-service",
},
};
export default function MobileAppDevelopmentService() {
return (
<MainLayout>

View File

@ -1,6 +1,5 @@
"use client";
import React, { useEffect } from "react";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
@ -12,36 +11,25 @@ import ChooseSection from "@/components/home/home-1/ChooseSection";
import TestimonialsSection from "@/components/home/home-1/TestimonialsSection";
import BlogSection from "@/components/home/home-1/BlogSection";
import BrandSection from "@/components/home/home-1/BrandSection";
import IconCounterSection from "@/components/home/home-2/IconCounterSection";
import OfferSection from "@/components/home/OfferSection";
import FeaturesSection from "@/components/home/home-1/FeaturesSection";
import ContactSection from "@/components/careers/ContactSection";
import FaqVideoSection from "@/components/careers/FaqVideoSection";
import AboutTwo from "@/components/home/AboutTwo";
import MedicalServices from "@/components/home/MedicalServices";
import WhyChooseTwo from "@/components/home/WhyChooseTwo";
import HistoryTwo from "@/components/home/HistoryTwo";
import AboutThree from "@/components/home/AboutThree";
import HomeContactOne from "@/components/home/HomeContactOne";
import FaqFour from "@/components/home/FaqFour";
import CounsellingSolutions from "@/components/home/CounsellingSolutions";
import CallAreaThree from "@/components/home/CallAreaThree";
import CounterAreaTwo from "@/components/home/CounterAreaTwo";
import MedicalServices from "@/components/home/MedicalServices";
import HomeContactOne from "@/components/home/HomeContactOne";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Metatroncube: Leaders in Web & Mobile Dev, SEO, Digital Marketing",
description: "Metatroncube Software Solutions: Your go-to agency for cutting-edge web & app development, SEO, digital marketing, and graphic design services.",
alternates: {
canonical: "/",
},
};
export default function MainPage() {
useEffect(() => {
const init = () => {
if (typeof window !== "undefined" && (window as any).initMetatron && (window as any).jQuery) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<BannerSection />
@ -57,14 +45,6 @@ export default function MainPage() {
<TestimonialsSection />
<HomeContactOne />
<BlogSection />
{/* <AboutTwo /> */}
{/* <WhyChooseTwo /> */}
{/* <HistoryTwo /> */}
{/* <AboutThree /> */}
{/* <IconCounterSection /> */}
{/* <ContactSection /> */}
{/* <FaqFour /> */}
</main>
<Footer1 />
</>

View File

@ -1,31 +1,23 @@
"use client";
import React, { useEffect } from "react";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import PortfolioSection from "@/components/home/PortfolioSection";
import Link from "next/link";
import PageHeader from "@/components/common/PageHeader";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Metatroncube: Leaders in Web &amp; Mobile Dev, SEO, Digital Marketing",
description: "Metatroncube Software Solutions: Your go-to agency for cutting-edge web &amp; app development, SEO, digital marketing, and graphic design services",
alternates: {
canonical: "/portfolio",
},
};
/* ── Page ── */
export default function PortfolioPage() {
useEffect(() => {
const init = () => {
if (
typeof window !== "undefined" &&
(window as any).initMetatron &&
(window as any).jQuery
) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader

View File

@ -1,4 +1,5 @@
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import PageHeader from "@/components/common/PageHeader";
@ -6,6 +7,25 @@ import ServiceDetails from "@/components/services-digital-solutions/ServiceDetai
import { ourServices } from "@/utils/data";
import { notFound } from "next/navigation";
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
const { slug } = await params;
const service = ourServices.find((s) => s.slug === slug);
if (!service) {
return {
title: "Service Not Found",
};
}
return {
title: service.metatitle || `${service.title} | Metatroncube Software Solutions`,
description: service.metaDesc || service.description,
alternates: {
canonical: `/services-digital-solutions/${slug}`,
},
};
}
export async function generateStaticParams() {
return ourServices.map((service) => ({
slug: service.slug,

View File

@ -1,45 +1,29 @@
"use client";
import React, { useEffect } from "react";
import Header3 from "@/components/layout/Header3";
import Footer3 from "@/components/layout/Footer3";
import InnerBanner from "@/components/common/InnerBanner";
import AboutSection from "@/components/home/home-3/AboutSection";
import HelpFormSection from "@/components/home/home-3/HelpFormSection";
import ServiceSection from "@/components/home/home-3/ServiceSection";
import ChooseSection from "@/components/home/home-3/ChooseSection";
import ProjectsSection from "@/components/home/home-3/ProjectsSection";
import BrandsSection from "@/components/home/home-3/BrandsSection";
import FaqSection from "@/components/home/home-3/FaqSection";
import BlogSection from "@/components/home/home-3/BlogSection";
import FeaturesSection from "@/components/home/home-1/FeaturesSection";
import FeaturesSection2 from "@/components/home/home-2/FeaturesSection";
import CtaSection from "@/components/home/home-1/CtaSection";
import Footer1 from "@/components/layout/Footer1";
import React from "react";
import type { Metadata } from "next";
import Header1 from "@/components/layout/Header1";
import Footer1 from "@/components/layout/Footer1";
import FeaturesSection from "@/components/home/home-1/FeaturesSection";
import ChooseSection from "@/components/home/home-3/ChooseSection";
import WorkProcessSection from "@/components/home/home-2/WorkProcessSection";
import ServiceSection2 from "@/components/careers/ServiceSection";
import WorkProcessSection2 from "@/components/careers/WorkProcessSection";
import AboutService from "@/components/services-digital-solutions/AboutService";
import PageHeader from "@/components/common/PageHeader";
import AboutTwo from "@/components/home/AboutTwo";
import ResultsSection from "@/components/about/Results";
import MetatronInitializer from "@/components/MetatronInitializer";
export const metadata: Metadata = {
title: "Metatroncube | Digital Solutions: Web, Mobile & SEO Experts",
description: "Grow your brand with Metatroncubes digital solutions - web & mobile development, SEO & marketing services crafted to grow your online presence.",
alternates: {
canonical: "/services-digital-solutions",
},
};
export default function Home3() {
useEffect(() => {
const init = () => {
if (typeof window !== "undefined" && (window as any).initMetatron && (window as any).jQuery) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return (
<>
<MetatronInitializer />
<Header1 />
<main>
<PageHeader
@ -49,20 +33,11 @@ export default function Home3() {
/>
<FeaturesSection />
<ChooseSection />
{/* <HelpFormSection /> */}
{/* <ServiceSection /> */}
<ServiceSection2 />
<WorkProcessSection />
<AboutTwo />
<ResultsSection />
{/* <AboutService /> */}
{/* <FeaturesSection2 /> */}
{/* <ProjectsSection /> */}
{/* <BrandsSection /> */}
{/* <FaqSection /> */}
<WorkProcessSection2 />
{/* <BlogSection /> */}
{/* <CtaSection/> */}
</main>
<Footer1 />
</>

View File

@ -1,4 +1,5 @@
import React from "react";
import type { Metadata } from "next";
import MainLayout from "@/components/web-development-service/support/layout/MainLayout";
import Hero from "@/components/web-development-service/Hero";
import BannerBottom from "@/components/web-development-service/BannerBottom";
@ -12,12 +13,17 @@ import CaseStudies from "@/components/web-development-service/CaseStudies";
import Testimonial from "@/components/web-development-service/Testimonial";
import FAQ from "@/components/web-development-service/FAQ";
import Pricing from "@/components/web-development-service/Pricing";
import { ourServices } from "@/utils/data";
import "@/components/web-development-service/style.css";
export default function WebsiteDevelopmentService() {
const service = ourServices.find((s) => s.slug === "web-development");
export const metadata: Metadata = {
title: "Expert Website Development Services | Metatroncube",
description: "Custom, responsive, and SEO-optimized website development services. We build digital masterpeices that drive business growth and engage users.",
alternates: {
canonical: "/website-development-service",
},
};
export default function WebsiteDevelopmentService() {
return (
<MainLayout>
<Hero />
@ -31,7 +37,7 @@ export default function WebsiteDevelopmentService() {
<CaseStudies />
<Pricing />
<Testimonial />
<FAQ faqData={service?.faq} />
<FAQ />
</MainLayout>
);
}

View File

@ -0,0 +1,18 @@
"use client";
import { useEffect } from "react";
export default function MetatronInitializer() {
useEffect(() => {
const init = () => {
if (typeof window !== "undefined" && (window as any).initMetatron && (window as any).jQuery) {
(window as any).initMetatron();
} else {
setTimeout(init, 100);
}
};
init();
}, []);
return null;
}

View File

@ -1,3 +1,5 @@
"use client";
import React, { useState } from "react";
import { BlogData } from "@/utils/constant.utils";
import Link from "next/link";

View File

@ -10,6 +10,8 @@ export interface ServiceType {
slug?: string;
content?: string;
faq?: { question: string; answer: string }[];
metatitle?: string;
metaDesc?: string;
}
export interface CaseStudyType {

View File

@ -543,6 +543,8 @@ export const ourServices = [
bannerLeftImage: "/assets/images/innerbanner/left/left-web-development.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-web-dev.webp",
description: "Business-tailored website design, development, management, and ongoing support services to grow your brand online effectively.",
metatitle: "Best Web Design Agency | Web Development Company waterloo, Canada",
metaDesc: "Top web design agency in Waterloo, Canada. Offering web development services to create stunning websites. Choose us best website design and development service.",
content: `
<h2 class="service-details__content-title">Website Development at Metatroncube: Crafting Digital Masterpieces</h2>
<p class="service-details__text">In the digital age, a website is more than just a digital footprint; its a powerful tool that encapsulates the essence of your brand, the voice of your business, and the gateway to connect with a global audience. At Metatroncube Software Solutions, we understand that each website is a unique blend of art and functionality, an opportunity to impress, engage, and convert your visitors into loyal customers.</p>
@ -827,6 +829,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-app-development.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-app-dev.webp",
description: "High-performance, scalable mobile apps tailored to your business needs across Android, iOS, and cross-platform technologies.",
metatitle: "Web & Mobile Application Development Agency in Waterloo, Canada",
metaDesc: "Top mobile apps designer services for Android in Canada. Leading mobile application development company in Waterloo. Choose us for top-notch app development service.",
content: `
<h2 class="service-details__content-title">Application Development at Metatroncube: Crafting Digital Masterpieces</h2>
<p class="service-details__text">Step into the future of mobile technology with Metatroncube's Application Development Services. Our expertise spans across various platforms and technologies, ensuring we deliver high-performance, scalable, and engaging mobile applications tailored to your business needs. Whether you're looking for native solutions or cross-platform versatility, our skilled developers are adept at turning your concepts into reality.</p>
@ -935,6 +939,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-graphic-design.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-graphic.webp",
description: "Elevate your brand with Metatroncube's comprehensive graphic design services—from logos and branding to UI/UX and packaging design.",
metatitle: "Best Branding Service & Graphic Design agency in Waterloo, Canada",
metaDesc: "Top graphic designing agency in Waterloo. Leading graphic design company in Canada offering graphic design service, and branding solutions. Best branding agencies.",
content: `
<h2 class="service-details__content-title">Graphic Design Services at Metatroncube</h2>
@ -1042,6 +1048,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-ui-ux.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-ui-ux.webp",
description: "Elevate your digital presence with intuitive, user-centered design that delights users and drives engagement.",
metatitle: "Best UI/UX Designing Company in Waterloo, Canada",
metaDesc: "Establish the best UI/UX design company in Waterloo to improve user experiences. Create user-friendly interfaces for digital success.",
content: `
<h2 class="service-details__content-title">UI/UX Design Services at Metatroncube: Shaping Experiences That Resonate</h2>
<p class="service-details__text">Elevate your digital presence with Metatroncube's UI/UX Design Services, where user experience meets stunning aesthetics. Our design team focuses on creating interfaces that are not only visually appealing but also intuitively navigable, ensuring users enjoy every interaction with your digital product. From initial research to final implementation, we craft experiences that delight users and drive engagement.</p>
@ -1152,6 +1160,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-seo-content.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-seo.webp",
description: "Transform your online presence with strategic SEO and compelling content that ranks, engages, and converts.",
metatitle: "Best SEO & Content Writing Company in waterloo, Canada",
metaDesc: "Boost online visibility with best SEO & Content Writing Services. Metatroncube, a Top-rated SEO company, agency for effective local search engine optimization.",
content: `
<h2 class="service-details__content-title">SEO & Content Writing Services at Metatroncube</h2>
@ -1259,6 +1269,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-digital-marketing.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-digital.webp",
description: "Transform your digital presence with data-driven strategies that captivate Canadian audiences and drive measurable growth.",
metatitle: "Best Digital Marketing Agency in Waterloo, Canada | SEO | SMM",
metaDesc: "Top digital marketing company in Canada. Best digital marketing agency in Waterloo offering top digital marketing service for all your business needs.",
content: `
<h2 class="service-details__content-title">Metatroncube Software Solutions: Revolutionizing Digital Marketing in Canada</h2>
@ -1402,6 +1414,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-services.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-services.webp",
description: "Discover personalized web design with Waterloo's creative architects. We craft digital artistry that resonates with your audience.",
metatitle: "Best Web Page Design in Waterloo-Stunning Pages that Convert",
metaDesc: "Metatroncube designs sleek, fast web pages in Waterloo - crafted for impact, clear UX, and results that turn visitors into loyal customers.",
content: `
<h2 class="service-details__content-title">Web Page Design in Waterloo Metatroncube: Crafting Digital Artistry in Web Page Design for Waterloo Community</h2>
@ -1437,6 +1451,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-web-development.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-web-dev.webp",
description: "Tailoring digital interfaces with bespoke website design from Kitchener's creative vanguard. We stand at the confluence of technology and creativity.",
metatitle: "Website Design Services in Kitchener-Waterloo | Metatroncube",
metaDesc: "Metatroncube's web design - Get custom web in Kitchener-Waterloo. Sleek, responsive, UX-driven designs that convert visitors into loyal customers.",
content: `
<h2 class="service-details__content-title">KITCHENER WATERLOO WEBSITE DESIGN SERVICES: Tailoring Digital Interfaces with Metatroncube</h2>
@ -1548,6 +1564,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-app-development.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-app-dev.webp",
description: "Premier app development in Waterloo, creating high-performance, scalable mobile applications tailored to the unique demands of local businesses and entrepreneurs.",
metatitle: "How much does it cost to hire someone to build a mobile app?",
metaDesc: "The cost to hire someone to build a mobile app can vary widely depending on several factors, including the complexity of the app, the platform(s) it will run on, the geographic location of the developers, and the level of design and functionality required. Simple apps may start in the range of a few thousand dollars, while more complex applications can cost tens or even hundreds of thousands of dollars.",
content: `
<h2 class="service-details__content-title">Application Development at Metatroncube: Premier App Development Waterloo</h2>
@ -1655,6 +1673,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-web-development.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-web-dev.webp",
description: "Empowering your digital journey in Waterloo with bespoke web design solutions that capture your business essence and connect with your local audience.",
metatitle: "Professional Website Designers in Waterloo | Metatroncube",
metaDesc: "Partner with Waterloos top web designers at Metatroncube - professional, elegant websites crafted for clarity, speed & high-impact brand presence.",
content: `
<h2 class="service-details__content-title">Metatroncube: Empowering Your Digital Journey in Waterloo</h2>
@ -1765,6 +1785,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-web-development.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-web-dev.webp",
description: "Unlock the potential of your online presence with premier web design in Toronto—crafting bespoke, SEO-optimized websites that capture your brand essence.",
metatitle: "Top Custom Website Creators in Toronto | Metatroncube",
metaDesc: "Build a standout website in Toronto with Metatroncube - custom designs, smooth UX, & high-performance sites crafted to elevate your brand online.",
content: `
<h2 class="service-details__content-title">Unlock the Potential of Your Online Presence with Metatroncube Software Solutions Premier Web Design in Toronto</h2>
@ -1824,6 +1846,8 @@ Robust Security</li>
bannerLeftImage: "/assets/images/innerbanner/left/left-seo-content.webp",
bannerRightImage: "/assets/images/innerbanner/right/right-seo.webp",
description: "Revolutionizing your online visibility with Waterloo SEO strategies that propel your business to the top of local search rankings.",
metatitle: "The Best SEO & Content Writing Services in Waterloo",
metaDesc: "Boost visibility with the best SEO & content writing services in Waterloo. Drive traffic, engage readers, and grow your brand with expert strategies.",
content: `
<h2 class="service-details__content-title">Waterloo SEO Services "Waterloo SEO": Revolutionizing Your Online Visibility</h2>
<p class="service-details__text">In the heart of Waterloo's dynamic digital landscape, excelling in SEO is not just beneficial; it's essential. Metatroncube Software Solutions specializes in Waterloo SEO, crafting strategies that propel your business to the top of search rankings in the local market. Our approach to "Waterloo SEO" is designed to maximize your digital footprint and elevate your brand in the Waterloo area. By understanding the unique aspects of the local market, we tailor our SEO strategies to ensure your business not only gets noticed but becomes a leading voice in your industry.</p>