diff --git a/angular.json b/angular.json index 2eb989c..d77f79c 100644 --- a/angular.json +++ b/angular.json @@ -48,13 +48,15 @@ ], "tsConfig": "tsconfig.app.json", "assets": [ + "src/assets", { "glob": "**/*", "input": "public" } ], "styles": [ - "src/styles.css" + "src/styles.css", + "node_modules/aos/dist/aos.css" ], "scripts": [] }, diff --git a/package-lock.json b/package-lock.json index b5eb517..3a66573 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@angular/platform-browser": "^18.2.0", "@angular/platform-browser-dynamic": "^18.2.0", "@angular/router": "^18.2.0", + "aos": "^2.3.4", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.10" @@ -24,9 +25,26 @@ "@angular-devkit/build-angular": "^18.2.12", "@angular/cli": "^18.2.12", "@angular/compiler-cli": "^18.2.0", + "@types/aos": "^3.0.7", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", "typescript": "~5.5.2" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -186,6 +204,35 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", @@ -443,6 +490,36 @@ "typescript": ">=5.4 <5.6" } }, + "node_modules/@angular/compiler-cli/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/compiler-cli/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular/core": { "version": "18.2.13", "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.13.tgz", @@ -4082,6 +4159,13 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@types/aos": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/aos/-/aos-3.0.7.tgz", + "integrity": "sha512-sEhyFqvKauUJZDbvAB3Pggynrq6g+2PS4XB3tmUr+mDL1gfDJnwslUC4QQ7/l8UD+LWpr3RxZVR/rHoZrLqZVg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -4730,6 +4814,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -4757,6 +4848,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/aos": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz", + "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==", + "license": "MIT", + "dependencies": { + "classlist-polyfill": "^1.0.3", + "lodash.debounce": "^4.0.6", + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5195,6 +5304,16 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001690", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", @@ -5241,19 +5360,41 @@ "license": "MIT" }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 8.10.0" }, "funding": { "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/chownr": { @@ -5276,6 +5417,12 @@ "node": ">=6.0" } }, + "node_modules/classlist-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", + "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==", + "license": "Unlicense" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -5937,6 +6084,20 @@ "dev": true, "license": "MIT" }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -7910,6 +8071,19 @@ } } }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8068,7 +8242,12 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "license": "MIT" }, "node_modules/log-symbols": { @@ -8755,6 +8934,18 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.8", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", @@ -9102,6 +9293,26 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", @@ -9588,6 +9799,16 @@ "node": ">=6" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/piscina": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", @@ -9615,9 +9836,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -9636,13 +9857,87 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, "node_modules/postcss-loader": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", @@ -9745,6 +10040,46 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-selector-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", @@ -9919,6 +10254,26 @@ "node": ">= 0.8" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -9935,17 +10290,29 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">=8.6" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/reflect-metadata": { @@ -10377,70 +10744,6 @@ } } }, - "node_modules/sass/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/sass/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sass/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -11244,6 +11547,39 @@ "node": ">=6" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11280,6 +11616,58 @@ "node": ">=0.10" } }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -11405,6 +11793,29 @@ } } }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -11488,6 +11899,13 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -12246,35 +12664,6 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -12453,44 +12842,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", @@ -12516,32 +12867,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/webpack-merge": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", @@ -12834,6 +13159,19 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 70047e3..10a31d6 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@angular/platform-browser": "^18.2.0", "@angular/platform-browser-dynamic": "^18.2.0", "@angular/router": "^18.2.0", + "aos": "^2.3.4", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.10" @@ -25,6 +26,10 @@ "@angular-devkit/build-angular": "^18.2.12", "@angular/cli": "^18.2.12", "@angular/compiler-cli": "^18.2.0", + "@types/aos": "^3.0.7", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", "typescript": "~5.5.2" } } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 0e4a8e5..86789e4 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,16 +1,26 @@ +// src/app/app.component.ts +import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; - +import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; +import * as AOS from 'aos'; @Component({ selector: 'app-root', standalone: true, - imports: [], + imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive], template: ` -

Welcome to {{title}}!

- - - `, - styles: [], + + ` }) export class AppComponent { - title = 'bay-area-affiliates__'; -} + ngOnInit() { + AOS.init({ + duration: 1000, + once: true + }); + } + ngAfterViewInit(): void { + setTimeout(() => { + AOS.refresh(); + }, 500); + } +} \ No newline at end of file diff --git a/src/app/app.config.ts b/src/app/app.config.ts index d03bbbc..58cbfe0 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,5 +1,15 @@ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +import { provideRouter, Routes } from '@angular/router'; +import { AppComponent } from './app.component'; +import { BlogPostComponent } from './components/blog-post.component'; +import { LandingPageComponent } from './components/landing-page.component'; + +export const routes: Routes = [ + { path: '', component: LandingPageComponent }, + { path: 'blog/:id', component: BlogPostComponent }, + { path: '**', redirectTo: '' } // Fallback-Route +]; export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true })] + providers: [provideRouter(routes),provideZoneChangeDetection({ eventCoalescing: true })] }; diff --git a/src/app/components/blog-post.component.ts b/src/app/components/blog-post.component.ts new file mode 100644 index 0000000..1c730b6 --- /dev/null +++ b/src/app/components/blog-post.component.ts @@ -0,0 +1,57 @@ +// src/app/components/blog-post/blog-post.component.ts +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { BlogService } from '../services/blog.service'; +import { FooterComponent } from './footer.component'; +import { HeaderComponent } from './header.component'; + +@Component({ + selector: 'app-blog-post', + standalone: true, + imports: [CommonModule, HeaderComponent, FooterComponent], + template: ` + + @if(safeContent){ +
+
+ +

{{ post?.title }}

+ +
+
+
+ } + + ` +}) +export class BlogPostComponent implements OnInit { + post: any; + safeContent: SafeHtml | null = null; + + constructor( + private route: ActivatedRoute, + private router: Router, + private blogService: BlogService, + private sanitizer: DomSanitizer + ) {} + + ngOnInit() { + const postId = this.route.snapshot.paramMap.get('id'); + this.post = this.blogService.getPost(postId); + + if (this.post && this.post.content) { + this.safeContent = this.sanitizer.bypassSecurityTrustHtml(this.post.content); + } else { + // Redirect to a 404 page or display an error message + this.router.navigate(['**']); + } + } + ngAfterViewInit(){ + + } + goBack() { + this.router.navigate(['']); + } +} diff --git a/src/app/components/blog.component.ts b/src/app/components/blog.component.ts new file mode 100644 index 0000000..c7bb2cc --- /dev/null +++ b/src/app/components/blog.component.ts @@ -0,0 +1,59 @@ +// src/app/components/blog/blog.component.ts +import { Component, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { BlogService } from '../services/blog.service'; + +@Component({ + selector: 'app-blog', + standalone: true, + imports: [CommonModule, RouterLink], + template: ` +
+
+

Latest Insights

+

Stay updated with our latest news and articles.

+
+
+ +

{{ post.title }}

+

+ {{ getShortContent(post.content) }} +

+ Read More +
+
+
+
+ ` +}) +export class BlogComponent implements OnInit { + blogPosts: any[] = []; + + constructor(private blogService: BlogService) {} + + ngOnInit() { + const posts = this.blogService.getAllPosts(); + // Convert the blogPosts object to an array + this.blogPosts = Object.keys(posts).map(key => posts[key]); + } + + // Function to get a short preview of the content + getShortContent(content: string): string { + const div = document.createElement('div'); + div.innerHTML = content; + const text = div.textContent || div.innerText || ''; + return text.substring(0, 150) + '...'; + } + + // Function to get post ID based on the title + getPostId(title: string): string { + const posts = this.blogService.getAllPosts(); + for (const id in posts) { + if (posts[id].title === title) { + return id; + } + } + return '1'; // Default to '1' if not found + } +} diff --git a/src/app/components/call2action.component.ts b/src/app/components/call2action.component.ts new file mode 100644 index 0000000..c5d3f5f --- /dev/null +++ b/src/app/components/call2action.component.ts @@ -0,0 +1,45 @@ +// src/app/components/footer/footer.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-call2action', + standalone: true, + imports: [CommonModule], + template: `
+
+ +
+

+ Ready to Elevate Your IT Infrastructure? +

+

+ Contact Bay Area Affiliates, Inc. today and let our + experts handle your IT needs. +

+ Get in Touch +
+ +
+ +
+
+
` +}) +export class Call2ActionComponent{} \ No newline at end of file diff --git a/src/app/components/contact.component.ts b/src/app/components/contact.component.ts new file mode 100644 index 0000000..4b7f80a --- /dev/null +++ b/src/app/components/contact.component.ts @@ -0,0 +1,69 @@ +// src/app/components/contact/contact.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'app-contact', + standalone: true, + imports: [CommonModule, FormsModule], + template: ` +
+
+

Get in Touch

+

We're here to help you with all your IT needs.

+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ ` +}) +export class ContactComponent { + formData = { + name: '', + email: '', + message: '' + }; + + onSubmit() { + console.log('Form submitted:', this.formData); + // Implement your form submission logic here + } +} \ No newline at end of file diff --git a/src/app/components/features.component.ts b/src/app/components/features.component.ts new file mode 100644 index 0000000..e1843c5 --- /dev/null +++ b/src/app/components/features.component.ts @@ -0,0 +1,54 @@ +// src/app/components/features/features.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-features', + standalone: true, + imports: [CommonModule], + template: ` +
+
+

Why Choose Us

+

+ Discover the benefits of partnering with Bay Area Affiliates, Inc. +

+
+ +
+
+ +
+
+

Experienced Team

+

Over 25 years of expertise in IT services and solutions.

+
+
+ + +
+
+ +
+
+

Secure Solutions

+

Top-notch security measures to protect your business data.

+
+
+ + +
+
+ +
+
+

Customized Solutions

+

Tailored IT strategies to meet your unique business requirements.

+
+
+
+
+
+ ` +}) +export class FeaturesComponent {} \ No newline at end of file diff --git a/src/app/components/footer.component.ts b/src/app/components/footer.component.ts new file mode 100644 index 0000000..a55f3ff --- /dev/null +++ b/src/app/components/footer.component.ts @@ -0,0 +1,209 @@ +// src/app/components/footer/footer.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-footer', + standalone: true, + imports: [CommonModule], + template: ` + + ` +}) +export class FooterComponent { + currentYear = new Date().getFullYear(); + showPrivacyPolicy = false; + showTerms = false; +} \ No newline at end of file diff --git a/src/app/components/header.component.ts b/src/app/components/header.component.ts new file mode 100644 index 0000000..ab61165 --- /dev/null +++ b/src/app/components/header.component.ts @@ -0,0 +1,50 @@ +// src/app/components/header/header.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-header', + standalone: true, + imports: [CommonModule], + template: ` +
+
+
+ Bay Area Affiliates, Inc. +
+ + +
+
+ ` +}) +export class HeaderComponent { + isMenuOpen = false; + + toggleMenu() { + this.isMenuOpen = !this.isMenuOpen; + } +} \ No newline at end of file diff --git a/src/app/components/hero.component.ts b/src/app/components/hero.component.ts new file mode 100644 index 0000000..4481b69 --- /dev/null +++ b/src/app/components/hero.component.ts @@ -0,0 +1,30 @@ +// src/app/components/hero/hero.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-hero', + standalone: true, + imports: [CommonModule], + template: ` +
+
+
+

+ Reliable IT Services for Over 25 Years +

+

+ Providing top-notch Computer & Networking solutions to the Coastal Bend community. +

+ + Get in Touch + +
+
+ IT Services +
+
+
+ ` +}) +export class HeroComponent {} \ No newline at end of file diff --git a/src/app/components/landing-page.component.ts b/src/app/components/landing-page.component.ts new file mode 100644 index 0000000..5b44692 --- /dev/null +++ b/src/app/components/landing-page.component.ts @@ -0,0 +1,51 @@ +// src/app/components/landing-page/landing-page.component.ts +import { Component, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import * as AOS from 'aos'; +import { BlogComponent } from './blog.component'; +import { Call2ActionComponent } from './call2action.component'; +import { ContactComponent } from './contact.component'; +import { FeaturesComponent } from './features.component'; +import { FooterComponent } from './footer.component'; +import { HeaderComponent } from './header.component'; +import { HeroComponent } from './hero.component'; +import { ServicesComponent } from './services.component'; + +@Component({ + selector: 'app-landing-page', + standalone: true, + imports: [ + CommonModule, + HeaderComponent, + HeroComponent, + ServicesComponent, + FeaturesComponent, + Call2ActionComponent, + BlogComponent, + ContactComponent, + FooterComponent + ], + template: ` + + + + + + + + + ` +}) +export class LandingPageComponent { + // ngOnInit() { + // AOS.init({ + // duration: 1000, + // once: true + // }); + // } + // ngAfterViewInit(): void { + // setTimeout(() => { + // AOS.refresh(); + // }, 500); + // } +} diff --git a/src/app/components/services.component.ts b/src/app/components/services.component.ts new file mode 100644 index 0000000..0af66b6 --- /dev/null +++ b/src/app/components/services.component.ts @@ -0,0 +1,134 @@ +// src/app/components/services/services.component.ts +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-services', + standalone: true, + imports: [CommonModule], + template: ` +
+
+

Our Services

+

+ Comprehensive IT solutions tailored to your business needs. + Read concrete examples of these topics in our + Latest Insights + section. +

+
+ +
+
+ +
+

Windows 11 Transition

+

+ Upgrade to Windows 11 before October 2025 to ensure continued security support and take advantage of the latest features. +

+
+ + +
+
+ +
+

Web Services

+

+ Web design, domain registration, email services, and more to establish and enhance your online presence. +

+
+ + +
+
+ +
+

Performance Upgrades

+

+ Enhance your desktops and laptops with SSDs, maintain your Windows installations, and achieve dramatic performance boosts. +

+
+ + +
+
+ +
+

Printer & Scanner Installation

+

+ Professional installation and configuration of printers and scanners to ensure seamless integration into your workflow. +

+
+ +
+
+ +
+

+ New/Refurbished Desktop Hardware +

+

+ Supply and installation of new or refurbished + desktop hardware, tailored to meet your business + requirements. +

+
+ +
+
+ +
+

VPN Setup

+

+ Configure Virtual Private Networks to allow secure + remote access to your internal network from + anywhere. +

+
+ +
+
+ +
+

+ Network Infrastructure Support +

+

+ Robust network solutions to ensure connectivity, + security, and efficiency, including routers, access + points, and switches. +

+
+ +
+
+ +
+

+ Network Attached Storage +

+

+ Selection, setup, and maintenance of Network + Attached Storage solutions to provide scalable and + reliable data storage. +

+
+
+
+
+ ` +}) +export class ServicesComponent {} \ No newline at end of file diff --git a/src/app/services/blog.service.ts b/src/app/services/blog.service.ts new file mode 100644 index 0000000..aea214c --- /dev/null +++ b/src/app/services/blog.service.ts @@ -0,0 +1,205 @@ +// src/app/services/blog.service.ts +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class BlogService { + private blogPosts = { + '1': { + title: 'Upgrade Your HDD to SSD for Enhanced Performance', + image: 'assets/hdd2ssd1.webp', + content: ` +
+
+

Upgrade Your HDD to SSD for Enhanced Performance

+

In today's fast-paced digital world, the performance of your computer can significantly impact your productivity and overall experience. One of the most effective upgrades you can make is replacing your traditional Hard Disk Drive (HDD) with a Solid State Drive (SSD). Here's why this upgrade is essential and how we at Bay Area Affiliates, Inc. can help you seamlessly transition to a faster, more reliable storage solution.

+

Hardware Effort and Cost

+

Upgrading to a 500GB SSD typically costs around $40 in terms of hardware, making it an affordable investment for a substantial performance boost. Our team ensures that the installation is both cost-effective and tailored to meet your specific needs.

+

On-Site Installation

+

The SSD upgrade can be performed directly at your location, minimizing downtime and ensuring that your setup remains intact. Our technicians are equipped to handle installations efficiently, ensuring a smooth transition.

+

Installation Time

+

The entire process typically takes between 45 minutes to 1 hour, depending on the size of the HDD being replaced and the number of files stored. Our streamlined approach ensures that your computer is up and running with minimal disruption.

+

Choosing the Right SSD

+

It's crucial to select an SSD that matches the data capacity of your existing HDD. We assess your current storage usage to recommend an SSD that provides ample space without unnecessary excess.

+

Data Transfer and Partitioning

+

Once the SSD is installed, we set up the correct partition schema and perform a 1:1 data transfer from your old HDD to the new SSD. This ensures that all your files, applications, and settings are preserved without any data loss.

+

Seamless Boot and Enhanced Performance

+

After the data transfer, your computer will boot from the new SSD. You won't notice the transition, except for the dramatic reduction in boot times—from approximately 2-3 minutes down to about 10 seconds. Additionally, application launch times will be significantly faster, enhancing your overall computing experience.

+

Additional Benefits

+ +

Upgrading to an SSD is a simple yet effective way to breathe new life into your existing hardware. Whether you're a business looking to enhance employee productivity or an individual seeking a faster, more reliable computer, Bay Area Affiliates, Inc. is here to assist you every step of the way.

+

Contact us today to schedule your HDD to SSD upgrade and experience the difference firsthand!

+ → Get in Touch with Us +
+
+ ` + }, + '2': { + title: 'Secure Your Corporate Network Access with WireGuard VPN', + image: 'assets/vpn.webp', // Ensure this image exists in your assets folder + content: ` +
+
+

Secure Your Corporate Network Access with WireGuard VPN

+ +

+ The safest way to access an internal corporate network is through a Virtual Private Network (VPN). A VPN ensures that all actions performed externally mirror those possible within the corporate network, such as accessing Network Attached Storage (NAS) or remotely accessing a desktop via Remote Desktop Protocol (RDP). +

+

+ Let's explore how leveraging a robust VPN solution can enhance your network security. +

+ +

Why Choose WireGuard for Your VPN Needs

+ +

+ At Bayarea Affiliates, we exclusively use WireGuard, a lightweight VPN variant known for its simplicity and cost-effectiveness. Despite its lightweight nature, WireGuard does not compromise on security, standing toe-to-toe with established alternatives like IPsec and OpenVPN. +

+

+ Understanding the security mechanisms of WireGuard is crucial to appreciating its efficacy. +

+ +

Security Mechanisms of WireGuard

+ +

+ WireGuard employs state-of-the-art cryptography to ensure secure communications. It uses the Noise Protocol Framework, which provides robust security features such as perfect forward secrecy and authenticated encryption. WireGuard's minimal codebase reduces the potential for vulnerabilities, making it easier to audit and maintain. +

+

+ Now, let's delve into the different implementation options we offer for integrating WireGuard into your network. +

+ +

Our WireGuard Implementation Options

+ +

+ We support three variants of WireGuard implementation to cater to your specific network setup: +

+ +
    +
  1. + Your Router is WireGuard Capable: If your current router supports WireGuard (common in some Asus and TP-Link models), we configure it accordingly and provide detailed instructions on its usage. This option is seamless and cost-effective, utilizing your existing hardware. +
  2. +
  3. + Upgrade to a WireGuard Capable Router: If your router does not support WireGuard, we assist you in selecting a compatible router (available from approximately $100, depending on features). We handle the configuration and set up the new router to function analogously to your previous one, ensuring a smooth transition. +
  4. +
  5. + Use a Mini PC for WireGuard Integration: For those who prefer to retain their existing non-WireGuard capable router, we offer an alternative solution. We set up a compact mini PC (currently around $80) that manages the secure connection handshake in tandem with your existing router. While this configuration is more involved and time-consuming, it maintains robust security without compromising your current setup. +
  6. +
+

+ Each implementation option is designed to provide maximum security and flexibility based on your network requirements. +

+ +

Ensuring 99.999% Security

+ +

+ To achieve near-perfect security, we emphasize attention to critical configuration points. This includes proper key management, regular software updates, and strict access controls. Our comprehensive approach ensures that your VPN setup is resilient against potential threats. +

+

+ Let's recap the benefits and next steps for securing your corporate network with WireGuard VPN. +

+ +

Benefits of Implementing WireGuard VPN

+ +
    +
  • Enhanced Security: Advanced cryptographic techniques protect your data.
  • +
  • Cost-Effective: Lower setup and maintenance costs compared to other VPN solutions.
  • +
  • Ease of Use: Simplified configuration process reduces deployment time.
  • +
  • Performance: High-speed connections with minimal latency.
  • +
+

+ Ready to secure your corporate network? Contact us today to discuss the best WireGuard implementation strategy for your business. +

+ → Get in Touch with Us +
+
+ ` + }, + '3': { + title: 'Virtualizing Windows Machines: Future-Proof Your Corporate Network', + image: 'assets/virtualization-windows.webp', // Ensure this image exists in your assets folder + content: ` +
+
+

Virtualizing Windows Machines: Future-Proof Your Corporate Network

+ +

+ In October 2025, Microsoft will end support for security fixes on Windows 10. To protect your corporate network from hacker attacks post-support, it is essential to upgrade all network computers to Windows 11 or alternative operating systems like macOS or Linux. +

+

+ Upgrading to Windows 11 is straightforward for machines equipped with at least Intel processors from the 8th generation and AMD Ryzen processors from the 3rd generation, without incurring additional licensing costs. +

+ +

Seamless Upgrades with Compatible Hardware

+ +

+ At Bay Area Affiliates, we are dedicated to making your upgrade process as simple and swift as possible. Whether you're upgrading existing hardware or transitioning to a new operating system, our team ensures minimal disruption to your business operations. +

+

+ For systems running on older hardware, upgrading to new computers becomes a necessity. Bay Area Affiliates assists in procuring either new or refurbished PCs that meet your specific requirements, ensuring a smooth transition by setting them up with your existing software and data. +

+ +

Virtualized Windows Machines: A Cost-Effective Alternative

+ +

+ An intriguing alternative to investing in new or refurbished PCs is the virtualization of Windows machines. In this setup, your existing PC functions as a thin client, allowing you to remotely access a virtual machine hosted on a server. +

+

+ This approach can be cost-effective since servers capable of hosting 4-5 virtual machines are available for around $1000, translating to approximately $200-250 per computer. +

+ +

Efficient Remote Access with RDP

+ +

+ Access to these virtual machines is facilitated through RDP (Remote Desktop Protocol), a Microsoft remote protocol extensively utilized in large enterprises. This ensures a reliable and familiar experience for users accessing their virtual desktops. +

+

+ This virtualization strategy is particularly effective for roles primarily involving office tasks. However, it may not be suitable for resource-intensive activities such as video editing. +

+ +

Network Requirements for Virtualization

+ +

+ A robust and fast network is a prerequisite for effective virtualization. Wired networks are preferred due to their low latency, but a high-quality wireless connection (minimum AC or AX standard) can also suffice for accessing the server. +

+

+ At Bay Area Affiliates, we assist in setting up such virtualization solutions and evaluate whether this approach aligns with your business needs during our consultations. +

+ +

Advantages of Virtualization Over Individual PCs

+ +

+ Beyond cost savings, virtualization offers numerous advantages over maintaining individual PCs: +

+ +
    +
  • Centralized Management: Manage all virtual machines from a single server, simplifying updates and maintenance.
  • +
  • Scalability: Easily add or remove virtual machines as your business needs evolve without significant hardware investments.
  • +
  • Enhanced Security: Implement uniform security policies and quick recovery solutions to protect against threats.
  • +
  • Energy Efficiency: Reduce overall power consumption by consolidating computing resources.
  • +
  • Disaster Recovery: Virtual machines can be quickly backed up and restored, minimizing downtime in case of hardware failures.
  • +
+

+ By leveraging virtualization, businesses can achieve greater flexibility, improved security, and operational efficiencies, ensuring that your corporate network remains robust and adaptable to future challenges. +

+ → Get in Touch with Us +
+
+ ` + } +}; + + constructor() { } + + getAllPosts() { + return this.blogPosts; + } + + getPost(id: string | null) { + return this.blogPosts[id || '1']; + } +} diff --git a/src/assets/hdd2ssd.webp b/src/assets/hdd2ssd.webp new file mode 100644 index 0000000..205a853 Binary files /dev/null and b/src/assets/hdd2ssd.webp differ diff --git a/src/assets/hdd2ssd1.webp b/src/assets/hdd2ssd1.webp new file mode 100644 index 0000000..c16b791 Binary files /dev/null and b/src/assets/hdd2ssd1.webp differ diff --git a/src/assets/it-services.webp b/src/assets/it-services.webp new file mode 100644 index 0000000..8c7faba Binary files /dev/null and b/src/assets/it-services.webp differ diff --git a/src/assets/virtualization-windows.webp b/src/assets/virtualization-windows.webp new file mode 100644 index 0000000..f0d6241 Binary files /dev/null and b/src/assets/virtualization-windows.webp differ diff --git a/src/assets/vpn.webp b/src/assets/vpn.webp new file mode 100644 index 0000000..619d3b5 Binary files /dev/null and b/src/assets/vpn.webp differ diff --git a/src/index.html b/src/index.html index b86ffb1..dd6bf9e 100644 --- a/src/index.html +++ b/src/index.html @@ -1,13 +1,14 @@ - + - BayAreaAffiliates + Bay Area Affiliates, Inc. | IT Services for Coastal Bend + - + diff --git a/src/styles.css b/src/styles.css index 90d4ee0..5dbc40a 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1 +1,4 @@ /* You can add global styles to this file, and also import other style files */ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..8b69ff6 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,41 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/**/*.{html,ts}", + "./src/app/services/blog.service.ts", // Include the BlogService explicitly + ], + safelist: [ + 'mb-4', + 'text-gray-700', + 'text-blue-600', + 'hover:underline', + 'text-2xl', + 'font-semibold', + 'list-disc', + 'list-inside', + 'rounded-lg', + 'shadow-lg', + 'w-full', + 'h-auto', + 'object-cover', + 'py-20', + 'bg-white', + 'container', + 'mx-auto', + 'px-6', + 'text-3xl', + 'font-bold', + 'text-center', + 'mb-6', + 'text-gray-500', + 'text-sm', + 'hidden', + 'bg-gray-700', + 'flex', + // Include any other classes used in dynamic content + ], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/tsconfig.json b/tsconfig.json index a8bb65b..32f4480 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "compileOnSave": false, "compilerOptions": { "outDir": "./dist/out-tsc", - "strict": true, + "strict": false, "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true,