Compare commits

..

25 Commits

Author SHA1 Message Date
minori 8e34196f32 deps: update tsx to 4.21.0
Node.js CI / CI (pull_request) Successful in 22s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m19s
2026-02-03 19:29:14 -08:00
naomi a84ef3e2de fix: clarify community CTA
Node.js CI / CI (push) Successful in 19s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m20s
2026-02-02 16:15:18 -08:00
naomi 73057def0a release: v4.0.0
Node.js CI / CI (push) Successful in 19s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m37s
2026-01-29 16:50:18 -08:00
naomi feb30845f0 feat: do a total theme redesign (#8)
Node.js CI / CI (push) Successful in 19s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 50s
### Explanation

_No response_

### Issue

_No response_

### Attestations

- [ ] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/)
- [ ] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/).
- [ ] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/).

### Dependencies

- [ ] I have pinned the dependencies to a specific patch version.

### Style

- [ ] I have run the linter and resolved any errors.
- [ ] My pull request uses an appropriate title, matching the conventional commit standards.
- [ ] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request.

### Tests

- [ ] My contribution adds new code, and I have added tests to cover it.
- [ ] My contribution modifies existing code, and I have updated the tests to reflect these changes.
- [ ] All new and existing tests pass locally with my changes.
- [ ] Code coverage remains at or above the configured threshold.

### Documentation

_No response_

### Versioning

Major - My pull request introduces a breaking change.

Reviewed-on: #8
Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Co-committed-by: Naomi Carrigan <commits@nhcarrigan.com>
2026-01-29 16:11:18 -08:00
hikari 689dbbb76f docs: update feedback section to use support forum
Node.js CI / CI (push) Successful in 21s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m13s
2026-01-26 12:36:50 -08:00
naomi 4bd168585f release: v3.5.0
Node.js CI / CI (push) Successful in 18s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m0s
2025-12-23 12:03:19 -08:00
naomi b52f67df8e feat: ability to block community cta modal on specific urls
Node.js CI / CI (push) Successful in 19s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 50s
2025-12-23 12:01:37 -08:00
naomi ba2f300755 feat: automated upload of .gitea/workflows/ci.yml
Node.js CI / CI (push) Successful in 19s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 56s
2025-12-22 19:41:48 +01:00
naomi a362e67051 feat: automated upload of .gitea/workflows/ci.yml
Node.js CI / CI (push) Failing after 9s
Security Scan and Upload / Security & DefectDojo Upload (push) Has been cancelled
2025-12-22 19:35:16 +01:00
naomi 58d4a26afe feat: automated upload of .gitea/workflows/ci.yml
Node.js CI / Lint and Test (push) Failing after 3s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 58s
2025-12-22 19:25:08 +01:00
naomi 9f5f83b32b feat: automated upload of .npmrc
Node.js CI / Lint and Test (push) Successful in 23s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m4s
2025-12-22 19:16:02 +01:00
naomi 0ca8b41f25 feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 28s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 57s
2025-12-18 03:07:58 +01:00
naomi 531aeaa703 feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 28s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m14s
2025-12-17 23:25:57 +01:00
naomi bc99b44e38 feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 27s
Security Scan / Security Audit (push) Failing after 6m50s
2025-12-12 03:37:44 +01:00
naomi 43cbdfc820 feat: automated upload of .gitea/workflows/security.yml
Node.js CI / Lint and Test (push) Successful in 23s
Security Scan / Trivy Security Scan (push) Failing after 4m48s
2025-12-11 20:11:56 +01:00
naomi ccf3db91cd fix: property structure for analytics
Node.js CI / Lint and Test (push) Successful in 22s
2025-12-10 19:24:03 -08:00
naomi 7f8bcb31f0 release: v3.4.0
Node.js CI / Lint and Test (push) Successful in 23s
2025-12-10 19:07:02 -08:00
naomi 7a5032c112 feat: migrate analytics to latest plausible version 2025-12-10 19:06:34 -08:00
naomi f77c890e8e fix: decrease global font size, handle small screens in footer 2025-12-10 19:00:47 -08:00
naomi 923c44e634 feat: larger font size
Node.js CI / Lint and Test (push) Successful in 1m15s
2025-11-10 09:46:29 -08:00
naomi 9124ba2faa release: v3.3.0
Node.js CI / Lint and Test (push) Successful in 42s
2025-10-30 10:49:01 -07:00
naomi 11786260d8 feat: add more metadata
Node.js CI / Lint and Test (push) Has been cancelled
2025-10-30 10:48:42 -07:00
naomi aec68b86bb release: v3.2.0
Node.js CI / Lint and Test (push) Successful in 45s
2025-10-29 12:56:18 -07:00
naomi 791a0fab4f feat: new font wooooo 2025-10-29 12:56:18 -07:00
naomi a7540edb8f chore: remove sonar
Node.js CI / Lint and Test (push) Successful in 43s
2025-09-03 16:19:48 -07:00
8 changed files with 906 additions and 225 deletions
+14 -5
View File
@@ -8,22 +8,31 @@ on:
- main - main
jobs: jobs:
lint: ci:
name: Lint and Test name: CI
runs-on: ubuntu-latest
steps: steps:
- name: Checkout Source Files - name: Checkout Source Files
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Use Node.js v22 - name: Use Node.js v24
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 22 node-version: 24
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v2
with: with:
version: 9 version: 10
- name: Ensure Dependencies are Pinned
uses: naomi-lgbt/dependency-pin-check@main
with:
language: javascript
dev-dependencies: true
peer-dependencies: true
optional-dependencies: true
- name: Install Dependencies - name: Install Dependencies
run: pnpm install run: pnpm install
+177
View File
@@ -0,0 +1,177 @@
name: Security Scan and Upload
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 0 * * 1'
workflow_dispatch:
jobs:
security-audit:
name: Security & DefectDojo Upload
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Checkout code
uses: actions/checkout@v4
# --- AUTO-SETUP PROJECT ---
- name: Ensure DefectDojo Product Exists
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
PRODUCT_NAME: ${{ github.repository }}
PRODUCT_TYPE_ID: 1
run: |
sudo apt-get install jq -y > /dev/null
echo "Checking connection to $DD_URL..."
# Check if product exists - capture HTTP code to debug connection issues
RESPONSE=$(curl --write-out "%{http_code}" --silent --output /tmp/response.json \
-H "Authorization: Token $DD_TOKEN" \
"$DD_URL/api/v2/products/?name=$PRODUCT_NAME")
# If response is not 200, print error
if [ "$RESPONSE" != "200" ]; then
echo "::error::Failed to query DefectDojo. HTTP Code: $RESPONSE"
cat /tmp/response.json
exit 1
fi
COUNT=$(cat /tmp/response.json | jq -r '.count')
if [ "$COUNT" = "0" ]; then
echo "Creating product '$PRODUCT_NAME'..."
curl -s -X POST "$DD_URL/api/v2/products/" \
-H "Authorization: Token $DD_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "'"$PRODUCT_NAME"'", "description": "Auto-created by Gitea Actions", "prod_type": '$PRODUCT_TYPE_ID' }'
else
echo "Product '$PRODUCT_NAME' already exists."
fi
# --- 1. TRIVY (Dependencies & Misconfig) ---
- name: Install Trivy
run: |
sudo apt-get install wget apt-transport-https gnupg lsb-release -y
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install trivy -y
- name: Run Trivy (FS Scan)
run: |
trivy fs . --scanners vuln,misconfig --format json --output trivy-results.json --exit-code 0
- name: Upload Trivy to DefectDojo
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
run: |
echo "Uploading Trivy results..."
# Generate today's date in YYYY-MM-DD format
TODAY=$(date +%Y-%m-%d)
HTTP_CODE=$(curl --write-out "%{http_code}" --output response.txt --silent -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_TOKEN" \
-F "active=true" \
-F "verified=true" \
-F "scan_type=Trivy Scan" \
-F "engagement_name=CI/CD Pipeline" \
-F "product_name=${{ github.repository }}" \
-F "scan_date=$TODAY" \
-F "auto_create_context=true" \
-F "file=@trivy-results.json")
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "::error::Upload Failed with HTTP $HTTP_CODE"
echo "--- SERVER RESPONSE ---"
cat response.txt
echo "-----------------------"
exit 1
else
echo "Upload Success!"
fi
# --- 2. GITLEAKS (Secrets) ---
- name: Install Gitleaks
run: |
wget -qO gitleaks.tar.gz https://github.com/gitleaks/gitleaks/releases/download/v8.18.0/gitleaks_8.18.0_linux_x64.tar.gz
tar -xzf gitleaks.tar.gz
sudo mv gitleaks /usr/local/bin/ && chmod +x /usr/local/bin/gitleaks
- name: Run Gitleaks
run: gitleaks detect --source . -v --report-path gitleaks-results.json --report-format json --no-git || true
- name: Upload Gitleaks to DefectDojo
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
run: |
echo "Uploading Gitleaks results..."
TODAY=$(date +%Y-%m-%d)
HTTP_CODE=$(curl --write-out "%{http_code}" --output response.txt --silent -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_TOKEN" \
-F "active=true" \
-F "verified=true" \
-F "scan_type=Gitleaks Scan" \
-F "engagement_name=CI/CD Pipeline" \
-F "product_name=${{ github.repository }}" \
-F "scan_date=$TODAY" \
-F "auto_create_context=true" \
-F "file=@gitleaks-results.json")
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "::error::Upload Failed with HTTP $HTTP_CODE"
echo "--- SERVER RESPONSE ---"
cat response.txt
echo "-----------------------"
exit 1
else
echo "Upload Success!"
fi
# --- 3. SEMGREP (SAST) ---
- name: Install Semgrep (via pipx)
run: |
sudo apt-get install pipx -y
pipx install semgrep
# Add pipx binary path to GITHUB_PATH so next steps can see 'semgrep'
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Run Semgrep
run: semgrep scan --config=p/security-audit --config=p/owasp-top-ten --json --output semgrep-results.json . || true
- name: Upload Semgrep to DefectDojo
env:
DD_URL: ${{ secrets.DD_URL }}
DD_TOKEN: ${{ secrets.DD_TOKEN }}
run: |
echo "Uploading Semgrep results..."
TODAY=$(date +%Y-%m-%d)
HTTP_CODE=$(curl --write-out "%{http_code}" --output response.txt --silent -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_TOKEN" \
-F "active=true" \
-F "verified=true" \
-F "scan_type=Semgrep JSON Report" \
-F "engagement_name=CI/CD Pipeline" \
-F "product_name=${{ github.repository }}" \
-F "scan_date=$TODAY" \
-F "auto_create_context=true" \
-F "file=@semgrep-results.json")
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "::error::Upload Failed with HTTP $HTTP_CODE"
echo "--- SERVER RESPONSE ---"
cat response.txt
echo "-----------------------"
exit 1
else
echo "Upload Success!"
fi
-34
View File
@@ -1,34 +0,0 @@
name: Code Analysis
on:
push:
branches:
- main
jobs:
sonar:
name: SonarQube
steps:
- name: Checkout Source Files
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: SonarCube Scan
uses: SonarSource/sonarqube-scan-action@v4
timeout-minutes: 10
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: "https://quality.nhcarrigan.com"
with:
args: >
-Dsonar.sources=.
-Dsonar.projectKey=website-headers
- name: SonarQube Quality Gate check
uses: sonarsource/sonarqube-quality-gate-action@v1
with:
pollingTimeoutSec: 600
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: "https://quality.nhcarrigan.com"
+25
View File
@@ -0,0 +1,25 @@
# Package Manager Configuration
# Force pnpm usage - breaks npm/yarn intentionally
node-linker=pnpm
# Security: Disable all lifecycle scripts
ignore-scripts=true
enable-pre-post-scripts=false
# Security: Require packages to be 10+ days old before installation
minimum-release-age=14400
# Security: Verify package integrity hashes
verify-store-integrity=true
# Security: Enforce strict trust policies
trust-policy=strict
# Security: Strict peer dependency resolution
strict-peer-dependencies=true
# Performance: Use symlinks for node_modules
symlink=true
# Lockfile: Ensure lockfile is not modified during install
frozen-lockfile=false
+1 -1
View File
@@ -12,7 +12,7 @@ This page is currently deployed. [View the live website.]
## Feedback and Bugs ## Feedback and Bugs
If you have feedback or a bug report, please feel free to open a GitHub issue! If you have feedback or a bug report, please [log a ticket on our forum](https://support.nhcarrigan.com).
## Contributing ## Contributing
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "website-headers", "name": "website-headers",
"version": "3.1.0", "version": "4.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -25,7 +25,7 @@
"eslint": "9.17.0", "eslint": "9.17.0",
"globals": "15.14.0", "globals": "15.14.0",
"terser": "5.37.0", "terser": "5.37.0",
"tsx": "4.19.2", "tsx": "4.21.0",
"typescript": "5.7.2" "typescript": "5.7.2"
} }
} }
+135 -105
View File
@@ -30,8 +30,8 @@ importers:
specifier: 5.37.0 specifier: 5.37.0
version: 5.37.0 version: 5.37.0
tsx: tsx:
specifier: 4.19.2 specifier: 4.21.0
version: 4.19.2 version: 4.21.0
typescript: typescript:
specifier: 5.7.2 specifier: 5.7.2
version: 5.7.2 version: 5.7.2
@@ -56,8 +56,8 @@ packages:
cpu: [ppc64] cpu: [ppc64]
os: [aix] os: [aix]
'@esbuild/aix-ppc64@0.23.1': '@esbuild/aix-ppc64@0.27.2':
resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ppc64] cpu: [ppc64]
os: [aix] os: [aix]
@@ -68,8 +68,8 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
'@esbuild/android-arm64@0.23.1': '@esbuild/android-arm64@0.27.2':
resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
@@ -80,8 +80,8 @@ packages:
cpu: [arm] cpu: [arm]
os: [android] os: [android]
'@esbuild/android-arm@0.23.1': '@esbuild/android-arm@0.27.2':
resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
@@ -92,8 +92,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [android] os: [android]
'@esbuild/android-x64@0.23.1': '@esbuild/android-x64@0.27.2':
resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [android] os: [android]
@@ -104,8 +104,8 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@esbuild/darwin-arm64@0.23.1': '@esbuild/darwin-arm64@0.27.2':
resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
@@ -116,8 +116,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@esbuild/darwin-x64@0.23.1': '@esbuild/darwin-x64@0.27.2':
resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
@@ -128,8 +128,8 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
'@esbuild/freebsd-arm64@0.23.1': '@esbuild/freebsd-arm64@0.27.2':
resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
@@ -140,8 +140,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
'@esbuild/freebsd-x64@0.23.1': '@esbuild/freebsd-x64@0.27.2':
resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
@@ -152,8 +152,8 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@esbuild/linux-arm64@0.23.1': '@esbuild/linux-arm64@0.27.2':
resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@@ -164,8 +164,8 @@ packages:
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@esbuild/linux-arm@0.23.1': '@esbuild/linux-arm@0.27.2':
resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
@@ -176,8 +176,8 @@ packages:
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
'@esbuild/linux-ia32@0.23.1': '@esbuild/linux-ia32@0.27.2':
resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
@@ -188,8 +188,8 @@ packages:
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
'@esbuild/linux-loong64@0.23.1': '@esbuild/linux-loong64@0.27.2':
resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
@@ -200,8 +200,8 @@ packages:
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
'@esbuild/linux-mips64el@0.23.1': '@esbuild/linux-mips64el@0.27.2':
resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
@@ -212,8 +212,8 @@ packages:
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@esbuild/linux-ppc64@0.23.1': '@esbuild/linux-ppc64@0.27.2':
resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
@@ -224,8 +224,8 @@ packages:
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@esbuild/linux-riscv64@0.23.1': '@esbuild/linux-riscv64@0.27.2':
resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
@@ -236,8 +236,8 @@ packages:
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@esbuild/linux-s390x@0.23.1': '@esbuild/linux-s390x@0.27.2':
resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
@@ -248,26 +248,32 @@ packages:
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@esbuild/linux-x64@0.23.1': '@esbuild/linux-x64@0.27.2':
resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@esbuild/netbsd-arm64@0.27.2':
resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.21.5': '@esbuild/netbsd-x64@0.21.5':
resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
'@esbuild/netbsd-x64@0.23.1': '@esbuild/netbsd-x64@0.27.2':
resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
'@esbuild/openbsd-arm64@0.23.1': '@esbuild/openbsd-arm64@0.27.2':
resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [openbsd] os: [openbsd]
@@ -278,20 +284,26 @@ packages:
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
'@esbuild/openbsd-x64@0.23.1': '@esbuild/openbsd-x64@0.27.2':
resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
'@esbuild/openharmony-arm64@0.27.2':
resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.21.5': '@esbuild/sunos-x64@0.21.5':
resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
'@esbuild/sunos-x64@0.23.1': '@esbuild/sunos-x64@0.27.2':
resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
@@ -302,8 +314,8 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@esbuild/win32-arm64@0.23.1': '@esbuild/win32-arm64@0.27.2':
resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
@@ -314,8 +326,8 @@ packages:
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@esbuild/win32-ia32@0.23.1': '@esbuild/win32-ia32@0.27.2':
resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
@@ -326,8 +338,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@esbuild/win32-x64@0.23.1': '@esbuild/win32-x64@0.27.2':
resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -486,51 +498,61 @@ packages:
resolution: {integrity: sha512-IPSCTzP8GRYzY+siSnggIKrckC2U+kVXoen6eSHRDgU9a4EZCHHWWOiKio1EkieOOk2j6EvZaaHfQUCmt8UJBg==} resolution: {integrity: sha512-IPSCTzP8GRYzY+siSnggIKrckC2U+kVXoen6eSHRDgU9a4EZCHHWWOiKio1EkieOOk2j6EvZaaHfQUCmt8UJBg==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.29.0': '@rollup/rollup-linux-arm-musleabihf@4.29.0':
resolution: {integrity: sha512-GvHPu0UIDx+ohyS8vTYnwoSVMM5BH3NO+JwQs6GWNCuQVlC5rKxnH2WClTGu3NxiIfhKLai08IKUwn3QbzX1UQ==} resolution: {integrity: sha512-GvHPu0UIDx+ohyS8vTYnwoSVMM5BH3NO+JwQs6GWNCuQVlC5rKxnH2WClTGu3NxiIfhKLai08IKUwn3QbzX1UQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.29.0': '@rollup/rollup-linux-arm64-gnu@4.29.0':
resolution: {integrity: sha512-Pnnn/2CAZWcH9GQoj1nnr85Ejh7aNDe5MsEV0xhuFNUPF0SdnutJ7b2muOI5Kx12T0/i2ol5B/tlhMviZQDL3g==} resolution: {integrity: sha512-Pnnn/2CAZWcH9GQoj1nnr85Ejh7aNDe5MsEV0xhuFNUPF0SdnutJ7b2muOI5Kx12T0/i2ol5B/tlhMviZQDL3g==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.29.0': '@rollup/rollup-linux-arm64-musl@4.29.0':
resolution: {integrity: sha512-AP+DLj4q9FT22ZL43ssA3gizEn7/MfJcZ1BOuyEPqoriuH3a8VRuDddN0MtpUwEtiZL6jc1GY5/eL99hkloQ1Q==} resolution: {integrity: sha512-AP+DLj4q9FT22ZL43ssA3gizEn7/MfJcZ1BOuyEPqoriuH3a8VRuDddN0MtpUwEtiZL6jc1GY5/eL99hkloQ1Q==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-loongarch64-gnu@4.29.0': '@rollup/rollup-linux-loongarch64-gnu@4.29.0':
resolution: {integrity: sha512-1+jPFClHmDATqbk0Cwi74KEOymVcs09Vbqe/CTKqLwCP0TeP2CACfnMnjYBs5CJgO20e/4bxFtmbR/9fKE1gug==} resolution: {integrity: sha512-1+jPFClHmDATqbk0Cwi74KEOymVcs09Vbqe/CTKqLwCP0TeP2CACfnMnjYBs5CJgO20e/4bxFtmbR/9fKE1gug==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-powerpc64le-gnu@4.29.0': '@rollup/rollup-linux-powerpc64le-gnu@4.29.0':
resolution: {integrity: sha512-Nmt5Us5w2dL8eh7QVyAIDVVwBv4wk8ljrBQe7lWkLaOcwABDaFQ3K4sAAC6IsOdJwaXXW+d85zVaMN+Xl8Co2w==} resolution: {integrity: sha512-Nmt5Us5w2dL8eh7QVyAIDVVwBv4wk8ljrBQe7lWkLaOcwABDaFQ3K4sAAC6IsOdJwaXXW+d85zVaMN+Xl8Co2w==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.29.0': '@rollup/rollup-linux-riscv64-gnu@4.29.0':
resolution: {integrity: sha512-KGuQ8WGhnq09LR7eOru7P9jfBSYXTMhq6TyavWfmEo+TxvkvuRwOCee5lPIa6HYjblOuFr4GeOxSE0c8iyw2Fg==} resolution: {integrity: sha512-KGuQ8WGhnq09LR7eOru7P9jfBSYXTMhq6TyavWfmEo+TxvkvuRwOCee5lPIa6HYjblOuFr4GeOxSE0c8iyw2Fg==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-s390x-gnu@4.29.0': '@rollup/rollup-linux-s390x-gnu@4.29.0':
resolution: {integrity: sha512-lSQtvrYIONme7a4gbf4O9d3zbZat3/5covIeoqk27ZIkTgBeL/67x+wq2bZfpLjkqQQp5SjBPQ/n0sg8iArzTg==} resolution: {integrity: sha512-lSQtvrYIONme7a4gbf4O9d3zbZat3/5covIeoqk27ZIkTgBeL/67x+wq2bZfpLjkqQQp5SjBPQ/n0sg8iArzTg==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.29.0': '@rollup/rollup-linux-x64-gnu@4.29.0':
resolution: {integrity: sha512-qh0ussrXBwnF4L07M9t1+jpHRhiGSae+wpNQDbmlXHXciT7pqpZ5zpk4dyGZPtDGB2l2clDiufE16BufXPGRWQ==} resolution: {integrity: sha512-qh0ussrXBwnF4L07M9t1+jpHRhiGSae+wpNQDbmlXHXciT7pqpZ5zpk4dyGZPtDGB2l2clDiufE16BufXPGRWQ==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.29.0': '@rollup/rollup-linux-x64-musl@4.29.0':
resolution: {integrity: sha512-YEABzSaRS7+v14yw6MVBZoMqLoUyTX1/sJoGeC0euvgMrzvw0i+jHo4keDZgYeOblfwdseVAf6ylxWSvcBAKTA==} resolution: {integrity: sha512-YEABzSaRS7+v14yw6MVBZoMqLoUyTX1/sJoGeC0euvgMrzvw0i+jHo4keDZgYeOblfwdseVAf6ylxWSvcBAKTA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.29.0': '@rollup/rollup-win32-arm64-msvc@4.29.0':
resolution: {integrity: sha512-jA4+oxG7QTTtSQxwSHzFVwShcppHO2DpkbAM59pfD5WMG/da79yQaeBtXAfGTI+ciUx8hqK3RF3H2KWByITXtQ==} resolution: {integrity: sha512-jA4+oxG7QTTtSQxwSHzFVwShcppHO2DpkbAM59pfD5WMG/da79yQaeBtXAfGTI+ciUx8hqK3RF3H2KWByITXtQ==}
@@ -1009,8 +1031,8 @@ packages:
engines: {node: '>=12'} engines: {node: '>=12'}
hasBin: true hasBin: true
esbuild@0.23.1: esbuild@0.27.2:
resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@@ -1959,8 +1981,8 @@ packages:
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsx@4.19.2: tsx@4.21.0:
resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
hasBin: true hasBin: true
@@ -2150,142 +2172,148 @@ snapshots:
'@esbuild/aix-ppc64@0.21.5': '@esbuild/aix-ppc64@0.21.5':
optional: true optional: true
'@esbuild/aix-ppc64@0.23.1': '@esbuild/aix-ppc64@0.27.2':
optional: true optional: true
'@esbuild/android-arm64@0.21.5': '@esbuild/android-arm64@0.21.5':
optional: true optional: true
'@esbuild/android-arm64@0.23.1': '@esbuild/android-arm64@0.27.2':
optional: true optional: true
'@esbuild/android-arm@0.21.5': '@esbuild/android-arm@0.21.5':
optional: true optional: true
'@esbuild/android-arm@0.23.1': '@esbuild/android-arm@0.27.2':
optional: true optional: true
'@esbuild/android-x64@0.21.5': '@esbuild/android-x64@0.21.5':
optional: true optional: true
'@esbuild/android-x64@0.23.1': '@esbuild/android-x64@0.27.2':
optional: true optional: true
'@esbuild/darwin-arm64@0.21.5': '@esbuild/darwin-arm64@0.21.5':
optional: true optional: true
'@esbuild/darwin-arm64@0.23.1': '@esbuild/darwin-arm64@0.27.2':
optional: true optional: true
'@esbuild/darwin-x64@0.21.5': '@esbuild/darwin-x64@0.21.5':
optional: true optional: true
'@esbuild/darwin-x64@0.23.1': '@esbuild/darwin-x64@0.27.2':
optional: true optional: true
'@esbuild/freebsd-arm64@0.21.5': '@esbuild/freebsd-arm64@0.21.5':
optional: true optional: true
'@esbuild/freebsd-arm64@0.23.1': '@esbuild/freebsd-arm64@0.27.2':
optional: true optional: true
'@esbuild/freebsd-x64@0.21.5': '@esbuild/freebsd-x64@0.21.5':
optional: true optional: true
'@esbuild/freebsd-x64@0.23.1': '@esbuild/freebsd-x64@0.27.2':
optional: true optional: true
'@esbuild/linux-arm64@0.21.5': '@esbuild/linux-arm64@0.21.5':
optional: true optional: true
'@esbuild/linux-arm64@0.23.1': '@esbuild/linux-arm64@0.27.2':
optional: true optional: true
'@esbuild/linux-arm@0.21.5': '@esbuild/linux-arm@0.21.5':
optional: true optional: true
'@esbuild/linux-arm@0.23.1': '@esbuild/linux-arm@0.27.2':
optional: true optional: true
'@esbuild/linux-ia32@0.21.5': '@esbuild/linux-ia32@0.21.5':
optional: true optional: true
'@esbuild/linux-ia32@0.23.1': '@esbuild/linux-ia32@0.27.2':
optional: true optional: true
'@esbuild/linux-loong64@0.21.5': '@esbuild/linux-loong64@0.21.5':
optional: true optional: true
'@esbuild/linux-loong64@0.23.1': '@esbuild/linux-loong64@0.27.2':
optional: true optional: true
'@esbuild/linux-mips64el@0.21.5': '@esbuild/linux-mips64el@0.21.5':
optional: true optional: true
'@esbuild/linux-mips64el@0.23.1': '@esbuild/linux-mips64el@0.27.2':
optional: true optional: true
'@esbuild/linux-ppc64@0.21.5': '@esbuild/linux-ppc64@0.21.5':
optional: true optional: true
'@esbuild/linux-ppc64@0.23.1': '@esbuild/linux-ppc64@0.27.2':
optional: true optional: true
'@esbuild/linux-riscv64@0.21.5': '@esbuild/linux-riscv64@0.21.5':
optional: true optional: true
'@esbuild/linux-riscv64@0.23.1': '@esbuild/linux-riscv64@0.27.2':
optional: true optional: true
'@esbuild/linux-s390x@0.21.5': '@esbuild/linux-s390x@0.21.5':
optional: true optional: true
'@esbuild/linux-s390x@0.23.1': '@esbuild/linux-s390x@0.27.2':
optional: true optional: true
'@esbuild/linux-x64@0.21.5': '@esbuild/linux-x64@0.21.5':
optional: true optional: true
'@esbuild/linux-x64@0.23.1': '@esbuild/linux-x64@0.27.2':
optional: true
'@esbuild/netbsd-arm64@0.27.2':
optional: true optional: true
'@esbuild/netbsd-x64@0.21.5': '@esbuild/netbsd-x64@0.21.5':
optional: true optional: true
'@esbuild/netbsd-x64@0.23.1': '@esbuild/netbsd-x64@0.27.2':
optional: true optional: true
'@esbuild/openbsd-arm64@0.23.1': '@esbuild/openbsd-arm64@0.27.2':
optional: true optional: true
'@esbuild/openbsd-x64@0.21.5': '@esbuild/openbsd-x64@0.21.5':
optional: true optional: true
'@esbuild/openbsd-x64@0.23.1': '@esbuild/openbsd-x64@0.27.2':
optional: true
'@esbuild/openharmony-arm64@0.27.2':
optional: true optional: true
'@esbuild/sunos-x64@0.21.5': '@esbuild/sunos-x64@0.21.5':
optional: true optional: true
'@esbuild/sunos-x64@0.23.1': '@esbuild/sunos-x64@0.27.2':
optional: true optional: true
'@esbuild/win32-arm64@0.21.5': '@esbuild/win32-arm64@0.21.5':
optional: true optional: true
'@esbuild/win32-arm64@0.23.1': '@esbuild/win32-arm64@0.27.2':
optional: true optional: true
'@esbuild/win32-ia32@0.21.5': '@esbuild/win32-ia32@0.21.5':
optional: true optional: true
'@esbuild/win32-ia32@0.23.1': '@esbuild/win32-ia32@0.27.2':
optional: true optional: true
'@esbuild/win32-x64@0.21.5': '@esbuild/win32-x64@0.21.5':
optional: true optional: true
'@esbuild/win32-x64@0.23.1': '@esbuild/win32-x64@0.27.2':
optional: true optional: true
'@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)':
@@ -3099,32 +3127,34 @@ snapshots:
'@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5 '@esbuild/win32-x64': 0.21.5
esbuild@0.23.1: esbuild@0.27.2:
optionalDependencies: optionalDependencies:
'@esbuild/aix-ppc64': 0.23.1 '@esbuild/aix-ppc64': 0.27.2
'@esbuild/android-arm': 0.23.1 '@esbuild/android-arm': 0.27.2
'@esbuild/android-arm64': 0.23.1 '@esbuild/android-arm64': 0.27.2
'@esbuild/android-x64': 0.23.1 '@esbuild/android-x64': 0.27.2
'@esbuild/darwin-arm64': 0.23.1 '@esbuild/darwin-arm64': 0.27.2
'@esbuild/darwin-x64': 0.23.1 '@esbuild/darwin-x64': 0.27.2
'@esbuild/freebsd-arm64': 0.23.1 '@esbuild/freebsd-arm64': 0.27.2
'@esbuild/freebsd-x64': 0.23.1 '@esbuild/freebsd-x64': 0.27.2
'@esbuild/linux-arm': 0.23.1 '@esbuild/linux-arm': 0.27.2
'@esbuild/linux-arm64': 0.23.1 '@esbuild/linux-arm64': 0.27.2
'@esbuild/linux-ia32': 0.23.1 '@esbuild/linux-ia32': 0.27.2
'@esbuild/linux-loong64': 0.23.1 '@esbuild/linux-loong64': 0.27.2
'@esbuild/linux-mips64el': 0.23.1 '@esbuild/linux-mips64el': 0.27.2
'@esbuild/linux-ppc64': 0.23.1 '@esbuild/linux-ppc64': 0.27.2
'@esbuild/linux-riscv64': 0.23.1 '@esbuild/linux-riscv64': 0.27.2
'@esbuild/linux-s390x': 0.23.1 '@esbuild/linux-s390x': 0.27.2
'@esbuild/linux-x64': 0.23.1 '@esbuild/linux-x64': 0.27.2
'@esbuild/netbsd-x64': 0.23.1 '@esbuild/netbsd-arm64': 0.27.2
'@esbuild/openbsd-arm64': 0.23.1 '@esbuild/netbsd-x64': 0.27.2
'@esbuild/openbsd-x64': 0.23.1 '@esbuild/openbsd-arm64': 0.27.2
'@esbuild/sunos-x64': 0.23.1 '@esbuild/openbsd-x64': 0.27.2
'@esbuild/win32-arm64': 0.23.1 '@esbuild/openharmony-arm64': 0.27.2
'@esbuild/win32-ia32': 0.23.1 '@esbuild/sunos-x64': 0.27.2
'@esbuild/win32-x64': 0.23.1 '@esbuild/win32-arm64': 0.27.2
'@esbuild/win32-ia32': 0.27.2
'@esbuild/win32-x64': 0.27.2
escalade@3.2.0: {} escalade@3.2.0: {}
@@ -4180,9 +4210,9 @@ snapshots:
tslib@2.8.1: {} tslib@2.8.1: {}
tsx@4.19.2: tsx@4.21.0:
dependencies: dependencies:
esbuild: 0.23.1 esbuild: 0.27.2
get-tsconfig: 4.8.1 get-tsconfig: 4.8.1
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
+550 -76
View File
@@ -40,6 +40,23 @@ const {
* The title and description are set by each website. This should * The title and description are set by each website. This should
* only load things like open graph data and favicons. * only load things like open graph data and favicons.
*/ */
const nhcarriganHeadersCharacterSet = document.createElement("meta");
nhcarriganHeadersCharacterSet.setAttribute("charset", "UTF-8");
const nhcarriganHeadersViewport = document.createElement("meta");
nhcarriganHeadersViewport.setAttribute("name", "viewport");
nhcarriganHeadersViewport.setAttribute(
"content",
"width=device-width, initial-scale=1.0",
);
const nhcarriganHeadersThemeColor = document.createElement("meta");
nhcarriganHeadersThemeColor.setAttribute("name", "theme-color");
nhcarriganHeadersThemeColor.setAttribute("content", "#4A0E0E");
const nhcarriganHeadersReferrer = document.createElement("meta");
nhcarriganHeadersReferrer.setAttribute("name", "referrer");
nhcarriganHeadersReferrer.setAttribute(
"content",
"strict-origin-when-cross-origin",
);
const nhcarriganHeadersOpenGraphTitle = document.createElement("meta"); const nhcarriganHeadersOpenGraphTitle = document.createElement("meta");
nhcarriganHeadersOpenGraphTitle.setAttribute("property", "og:title"); nhcarriganHeadersOpenGraphTitle.setAttribute("property", "og:title");
nhcarriganHeadersOpenGraphTitle.setAttribute( nhcarriganHeadersOpenGraphTitle.setAttribute(
@@ -68,6 +85,23 @@ nhcarriganHeadersOpenGraphUrl.setAttribute("content", nhcarriganHeadersUrl);
const nhcarriganHeadersOpenGraphType = document.createElement("meta"); const nhcarriganHeadersOpenGraphType = document.createElement("meta");
nhcarriganHeadersOpenGraphType.setAttribute("property", "og:type"); nhcarriganHeadersOpenGraphType.setAttribute("property", "og:type");
nhcarriganHeadersOpenGraphType.setAttribute("content", "website"); nhcarriganHeadersOpenGraphType.setAttribute("content", "website");
const nhcarriganHeadersOpenGraphSiteName = document.createElement("meta");
nhcarriganHeadersOpenGraphSiteName.setAttribute("property", "og:site_name");
nhcarriganHeadersOpenGraphSiteName.setAttribute("content", "NHCarrigan");
const nhcarriganHeadersOpenGraphLocale = document.createElement("meta");
nhcarriganHeadersOpenGraphLocale.setAttribute("property", "og:locale");
nhcarriganHeadersOpenGraphLocale.setAttribute("content", "en_US");
const nhcarriganHeadersOpenGraphImageAlt = document.createElement("meta");
nhcarriganHeadersOpenGraphImageAlt.setAttribute("property", "og:image:alt");
nhcarriganHeadersOpenGraphImageAlt.
setAttribute("content", "NHCarrigan logo and branding");
const nhcarriganHeadersOpenGraphImageWidth = document.createElement("meta");
nhcarriganHeadersOpenGraphImageWidth.setAttribute("property", "og:image:width");
nhcarriganHeadersOpenGraphImageWidth.setAttribute("content", "1920");
const nhcarriganHeadersOpenGraphImageHeight = document.createElement("meta");
nhcarriganHeadersOpenGraphImageHeight.
setAttribute("property", "og:image:height");
nhcarriganHeadersOpenGraphImageHeight.setAttribute("content", "1080");
const nhcarriganHeadersTwitterCard = document.createElement("meta"); const nhcarriganHeadersTwitterCard = document.createElement("meta");
nhcarriganHeadersTwitterCard.setAttribute("name", "twitter:card"); nhcarriganHeadersTwitterCard.setAttribute("name", "twitter:card");
@@ -100,6 +134,22 @@ nhcarriganHeadersTwitterImage.setAttribute(
"content", "content",
"https://cdn.nhcarrigan.com/og-image.png", "https://cdn.nhcarrigan.com/og-image.png",
); );
const nhcarriganHeadersTwitterSite = document.createElement("meta");
nhcarriganHeadersTwitterSite.setAttribute("name", "twitter:site");
nhcarriganHeadersTwitterSite.setAttribute("content", "@nhcarrigan1");
const nhcarriganHeadersTwitterCreator = document.createElement("meta");
nhcarriganHeadersTwitterCreator.setAttribute("name", "twitter:creator");
nhcarriganHeadersTwitterCreator.setAttribute("content", "@nhcarrigan1");
const nhcarriganHeadersFormatDetection = document.createElement("meta");
nhcarriganHeadersFormatDetection.setAttribute("name", "format-detection");
nhcarriganHeadersFormatDetection.setAttribute("content", "telephone=no");
const nhcarriganHeadersRobots = document.createElement("meta");
nhcarriganHeadersRobots.setAttribute("name", "robots");
nhcarriganHeadersRobots.setAttribute("content", "index, follow");
const nhcarriganHeadersAuthor = document.createElement("meta");
nhcarriganHeadersAuthor.setAttribute("name", "author");
nhcarriganHeadersAuthor.setAttribute("content", "Naomi Carrigan");
// #endregion // #endregion
@@ -131,13 +181,34 @@ const nhcarriganHeadersStyles = document.createElement("style");
nhcarriganHeadersStyles.id = "nhcarrigan-global-styles"; nhcarriganHeadersStyles.id = "nhcarrigan-global-styles";
nhcarriganHeadersStyles.innerHTML = ` nhcarriganHeadersStyles.innerHTML = `
@font-face { @font-face {
font-family: 'OpenDyslexic'; font-family: 'Vampyr';
src: url('https://cdn.nhcarrigan.com/fonts/OpenDyslexicMono-Regular.otf') format('opentype'); src: url('https://cdn.nhcarrigan.com/fonts/vampyr.ttf') format('truetype');
} }
/* Import fun and whimsical fonts! */
@import url('https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Creepster&family=Griffy&family=Henny+Penny&display=swap');
:root { :root {
--foreground: #8F2447; /* Witchy Purple Rose Palette */
--background: #E1F6F9DC; --witch-purple: #2B1B3D;
--witch-plum: #44275A;
--witch-rose: #A8577E;
--witch-mauve: #D4A5C7;
--witch-lavender: #E8D5E8;
--witch-black: #0A0009;
--witch-silver: #C0C0C0;
--witch-moon: #F5F5F5;
--witch-shadow: rgba(10, 0, 9, 0.7);
/* Theme variables */
--foreground: var(--witch-purple);
--background: var(--witch-moon);
--accent: var(--witch-rose);
--border: var(--witch-plum);
--highlight: var(--witch-mauve);
font-size: 14pt;
line-height: 1.6;
} }
* { * {
@@ -147,113 +218,491 @@ nhcarriganHeadersStyles.innerHTML = `
} }
html { html {
font-family: 'OpenDyslexic', monospace; font-family: 'Kalam', cursive, sans-serif;
cursor: url('https://cdn.nhcarrigan.com/cursors/cursor.cur'), auto; cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><g transform="translate(12 12) rotate(-45 12 12)"><circle cx="12" cy="6" r="5" fill="%232B1B3D"/><circle cx="6" cy="12" r="5" fill="%232B1B3D"/><circle cx="18" cy="12" r="5" fill="%232B1B3D"/><circle cx="12" cy="18" r="5" fill="%232B1B3D"/><circle cx="12" cy="12" r="3.5" fill="%23A8577E"/><path d="M12 18 L12 36" stroke="%232B1B3D" stroke-width="2.5"/><path d="M10 34 L8 38" stroke="%232B1B3D" stroke-width="2"/><path d="M14 34 L16 38" stroke="%232B1B3D" stroke-width="2"/></g><circle cx="3" cy="3" r="1.5" fill="%23D4A5C7" opacity="0.8"/></svg>') 0 0, url('https://cdn.nhcarrigan.com/cursors/cursor.cur'), auto;
min-height: 100vh; min-height: 100vh;
min-width: 100vw; min-width: 100vw;
} }
body {
min-height: 100vh;
position: relative;
}
/* Witchy mystical background */
body::before { body::before {
background: url(https://cdn.nhcarrigan.com/background.png);
background-size: cover;
background-position: center;
width: 100%;
height: 100%;
z-index: -1;
content: ""; content: "";
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
opacity: 1; background: url(https://cdn.nhcarrigan.com/background.png);
background-size: cover;
background-position: center;
z-index: -2;
pointer-events: none; pointer-events: none;
} }
/* Purple overlay for witchy effect */
body::after {
content: "";
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
radial-gradient(circle at 20% 50%, rgba(168, 87, 126, 0.35) 0%, transparent 60%),
radial-gradient(circle at 80% 80%, rgba(68, 39, 90, 0.35) 0%, transparent 60%),
linear-gradient(180deg,
rgba(10, 0, 9, 0.5) 0%,
rgba(43, 27, 61, 0.25) 50%,
rgba(43, 27, 61, 0.4) 100%
);
z-index: -1;
pointer-events: none;
}
main { main {
color: var(--foreground); color: var(--foreground);
background-color: var(--background); background: linear-gradient(135deg,
rgba(245, 245, 245, 0.95) 0%,
rgba(232, 213, 232, 0.9) 100%
);
text-align: center; text-align: center;
border-radius: 10px; border-radius: 15px;
width: 95%; width: 95%;
max-width: 1080px; max-width: 1080px;
margin: auto; margin: 20px auto 85px auto;
margin-bottom: 85px; padding: 40px;
padding: 10px; position: relative;
/* Simple elegant border */
border: 2px solid var(--witch-plum);
box-shadow:
/* Magical purple glow */
0 0 60px rgba(168, 87, 126, 0.4),
0 0 100px rgba(68, 39, 90, 0.3),
/* Standard shadow */
0 10px 40px var(--witch-shadow),
/* Inner glow */
inset 0 0 60px rgba(168, 87, 126, 0.05);
} }
footer { footer {
width: 100%; width: 100%;
color: var(--foreground); color: var(--witch-lavender);
background-color: var(--background); background: linear-gradient(to bottom,
rgba(43, 27, 61, 0.95) 0%,
var(--witch-black) 100%
);
position: fixed; position: fixed;
bottom: 0; bottom: 0;
height: 75px; height: 75px;
padding: 0 10px; padding: 0 10px;
border-top: 2px solid var(--witch-mauve);
box-shadow:
/* Purple glow from top border */
0 -10px 40px rgba(212, 165, 199, 0.3),
0 -5px 20px rgba(168, 87, 126, 0.4),
/* Standard shadow */
0 -5px 20px var(--witch-shadow);
} }
#footer-inner-container { #footer-inner-container {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
height: 75px; height: 75px;
} }
#footer-inner-container a {
color: var(--witch-lavender);
transition: all 0.3s ease;
}
#footer-inner-container a:hover {
color: var(--witch-mauve);
text-shadow: 0 0 10px rgba(212, 165, 199, 0.5);
}
#footer-badge-container { #footer-badge-container {
display: grid; display: grid;
grid-template-columns: repeat(8, 1fr); grid-template-columns: repeat(8, 1fr);
align-items: center; align-items: center;
justify-content: space-around; justify-content: space-around;
} }
#show-socials-button, #theme-select-button { #show-socials-button, #theme-select-button {
background: none; background: none;
border: none; border: 1px solid var(--witch-plum);
cursor: url('https://cdn.nhcarrigan.com/cursors/pointer.cur'), pointer; border-radius: 20px;
color: var(--foreground); cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><defs><filter id="glow"><feGaussianBlur stdDeviation="3" result="coloredBlur"/><feMerge><feMergeNode in="coloredBlur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g transform="translate(12 12) rotate(-45 12 12)" filter="url(%23glow)"><circle cx="12" cy="6" r="5.5" fill="%23A8577E"/><circle cx="6" cy="12" r="5.5" fill="%23A8577E"/><circle cx="18" cy="12" r="5.5" fill="%23A8577E"/><circle cx="12" cy="18" r="5.5" fill="%23A8577E"/><circle cx="12" cy="12" r="4" fill="%23D4A5C7"/><path d="M12 18 L12 36" stroke="%232B1B3D" stroke-width="2.5"/><path d="M10 34 L8 38" stroke="%232B1B3D" stroke-width="2"/><path d="M14 34 L16 38" stroke="%232B1B3D" stroke-width="2"/></g><circle cx="3" cy="3" r="2" fill="%23D4A5C7" opacity="0.9"/></svg>') 0 0, url('https://cdn.nhcarrigan.com/cursors/pointer.cur'), pointer;
color: var(--witch-lavender);
font-size: 1rem; font-size: 1rem;
font-family: 'OpenDyslexic', monospace; font-family: 'Kalam', cursive;
font-weight: 700;
padding: 8px 15px;
transition: all 0.3s ease;
} }
#show-socials-button:hover, #theme-select-button:hover {
background: rgba(168, 87, 126, 0.2);
border-color: var(--witch-mauve);
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(168, 87, 126, 0.3);
}
#show-socials-button > i, #theme-select-button > i { #show-socials-button > i, #theme-select-button > i {
font-size: 1.5rem; font-size: 1.2rem;
margin-right: 5px;
} }
a { a {
color: unset; color: var(--accent);
cursor: url('https://cdn.nhcarrigan.com/cursors/pointer.cur'), pointer; cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><defs><filter id="glow"><feGaussianBlur stdDeviation="3" result="coloredBlur"/><feMerge><feMergeNode in="coloredBlur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g transform="translate(12 12) rotate(-45 12 12)" filter="url(%23glow)"><circle cx="12" cy="6" r="5.5" fill="%23A8577E"/><circle cx="6" cy="12" r="5.5" fill="%23A8577E"/><circle cx="18" cy="12" r="5.5" fill="%23A8577E"/><circle cx="12" cy="18" r="5.5" fill="%23A8577E"/><circle cx="12" cy="12" r="4" fill="%23D4A5C7"/><path d="M12 18 L12 36" stroke="%232B1B3D" stroke-width="2.5"/><path d="M10 34 L8 38" stroke="%232B1B3D" stroke-width="2"/><path d="M14 34 L16 38" stroke="%232B1B3D" stroke-width="2"/></g><circle cx="3" cy="3" r="2" fill="%23D4A5C7" opacity="0.9"/></svg>') 0 0, url('https://cdn.nhcarrigan.com/cursors/pointer.cur'), pointer;
transition: all 0.3s ease;
text-decoration: none;
} }
a:hover {
color: var(--witch-plum);
text-decoration: underline;
text-decoration-color: var(--witch-mauve);
text-underline-offset: 3px;
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><defs><filter id="sparkle"><feGaussianBlur stdDeviation="4" result="coloredBlur"/><feMerge><feMergeNode in="coloredBlur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g transform="translate(12 12) rotate(-45 12 12)" filter="url(%23sparkle)"><circle cx="12" cy="6" r="6" fill="%23A8577E"/><circle cx="6" cy="12" r="6" fill="%23A8577E"/><circle cx="18" cy="12" r="6" fill="%23A8577E"/><circle cx="12" cy="18" r="6" fill="%23A8577E"/><circle cx="12" cy="12" r="4.5" fill="%23D4A5C7"/><path d="M12 18 L12 36" stroke="%232B1B3D" stroke-width="3"/><path d="M10 34 L8 38" stroke="%232B1B3D" stroke-width="2.5"/><path d="M14 34 L16 38" stroke="%232B1B3D" stroke-width="2.5"/></g><circle cx="3" cy="3" r="2.5" fill="%23E8D5E8"/><circle cx="8" cy="1" r="1" fill="%23D4A5C7"/><circle cx="1" cy="8" r="1" fill="%23D4A5C7"/></svg>') 0 0, pointer;
}
#tree-nation-offset-website { #tree-nation-offset-website {
display: flex; display: flex;
align-items: center; align-items: center;
} }
#social-list { #social-list {
position: absolute; position: absolute;
bottom: 75px; bottom: 75px;
left: 0; left: 50%;
right: 0; transform: translateX(-50%);
width: 100vw; width: 90vw;
max-width: 400px; max-width: 400px;
padding: 10px; padding: 20px;
background-color: var(--background); background: linear-gradient(135deg,
color: var(--foreground); rgba(43, 27, 61, 0.98) 0%,
border-radius: 10px; rgba(10, 0, 9, 0.95) 100%
border: 1px solid var(--foreground); );
color: var(--witch-lavender);
border-radius: 15px;
border: 1px solid var(--witch-mauve);
display: none; display: none;
z-index: 1000; z-index: 1000;
box-shadow:
0 10px 30px var(--witch-shadow),
inset 0 0 20px rgba(168, 87, 126, 0.1);
} }
.social-list-item { .social-list-item {
padding: 10px; padding: 12px;
transition: all 0.3s ease;
border-radius: 8px;
} }
.social-list-item > a { .social-list-item > a {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
text-decoration: none; text-decoration: none;
color: var(--witch-lavender);
} }
.social-list-item > a i {
font-size: 1.2rem;
margin-right: 12px;
color: var(--witch-mauve);
}
.social-list-divider { .social-list-divider {
border: 0.5px solid var(--foreground); border: none;
height: 1px;
background: linear-gradient(
to right,
transparent 20%,
var(--witch-mauve) 50%,
transparent 80%
);
margin: 8px 0;
opacity: 0.5;
} }
.social-list-item:hover { .social-list-item:hover {
background-color: var(--foreground); background: rgba(168, 87, 126, 0.2);
color: var(--background); transform: translateX(3px);
} }
.social-list-item:hover > a {
color: var(--witch-rose);
}
.is-dark { .is-dark {
--foreground: #E1F6F9; --foreground: var(--witch-lavender);
--background: #8F2447bb; --background: var(--witch-black);
--accent: var(--witch-mauve);
--border: var(--witch-rose);
--highlight: var(--witch-plum);
} }
/* Dark mode specific adjustments */
.is-dark main {
background: linear-gradient(135deg,
rgba(10, 0, 9, 0.95) 0%,
rgba(43, 27, 61, 0.9) 100%
);
color: var(--witch-lavender);
border-color: var(--witch-rose);
box-shadow:
/* Mystical rose glow for dark mode */
0 0 80px rgba(168, 87, 126, 0.5),
0 0 120px rgba(212, 165, 199, 0.3),
/* Standard shadow */
0 10px 40px rgba(0, 0, 0, 0.8),
/* Inner glow */
inset 0 0 60px rgba(168, 87, 126, 0.1);
}
.is-dark h1 { color: var(--witch-mauve); }
.is-dark h2, .is-dark h3 { color: var(--witch-lavender); }
.is-dark a {
color: var(--witch-mauve);
}
.is-dark a:hover {
color: var(--witch-rose);
}
/* Typography */
h1, h2, h3, h4, h5, h6 {
font-family: 'Griffy', cursive;
font-weight: 400;
letter-spacing: 1px;
}
@keyframes wiggle {
0%, 100% { transform: rotate(-2deg); }
25% { transform: rotate(2deg); }
50% { transform: rotate(-1deg); }
75% { transform: rotate(1deg); }
}
h1 {
color: var(--witch-plum);
font-size: 2.8rem;
text-shadow: 3px 3px 0px var(--witch-rose),
4px 4px 8px rgba(168, 87, 126, 0.4);
transform: rotate(-2deg);
display: inline-block;
animation: wiggle 4s ease-in-out infinite;
}
h2 {
color: var(--witch-purple);
font-size: 2.2rem;
text-shadow: 2px 2px 4px rgba(68, 39, 90, 0.3);
}
h3 {
color: var(--witch-purple);
font-size: 1.6rem;
font-family: 'Kalam', cursive;
font-weight: 700;
}
p {
line-height: 1.8;
margin-bottom: 1.2em;
}
/* Form elements */
input, textarea, select {
font-family: 'Kalam', cursive;
font-weight: 400;
font-size: 1rem;
padding: 12px 16px;
border: 2px solid var(--witch-plum);
border-radius: 15px;
background: rgba(245, 245, 245, 0.95);
color: var(--witch-purple);
transition: all 0.3s ease;
outline: none;
}
input[type="text"], input[type="email"], input[type="password"], textarea {
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><line x1="12" y1="6" x2="12" y2="42" stroke="%232B1B3D" stroke-width="2"/><line x1="8" y1="6" x2="16" y2="6" stroke="%232B1B3D" stroke-width="2"/><line x1="8" y1="42" x2="16" y2="42" stroke="%232B1B3D" stroke-width="2"/><circle cx="12" cy="24" r="3" fill="%23A8577E" opacity="0.5"/></svg>') 12 24, text;
}
input:focus, textarea:focus, select:focus {
border-color: var(--witch-rose);
box-shadow: 0 0 0 3px rgba(168, 87, 126, 0.15);
}
button, input[type="submit"], input[type="button"] {
font-family: 'Griffy', cursive;
font-weight: 400;
padding: 14px 28px;
background: linear-gradient(135deg,
var(--witch-plum) 0%,
var(--witch-purple) 100%
);
color: var(--witch-moon);
border: 3px solid transparent;
border-radius: 30px;
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><defs><filter id="glow"><feGaussianBlur stdDeviation="3" result="coloredBlur"/><feMerge><feMergeNode in="coloredBlur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g transform="translate(12 12) rotate(-45 12 12)" filter="url(%23glow)"><circle cx="12" cy="6" r="5.5" fill="%23A8577E"/><circle cx="6" cy="12" r="5.5" fill="%23A8577E"/><circle cx="18" cy="12" r="5.5" fill="%23A8577E"/><circle cx="12" cy="18" r="5.5" fill="%23A8577E"/><circle cx="12" cy="12" r="4" fill="%23D4A5C7"/><path d="M12 18 L12 36" stroke="%232B1B3D" stroke-width="2.5"/><path d="M10 34 L8 38" stroke="%232B1B3D" stroke-width="2"/><path d="M14 34 L16 38" stroke="%232B1B3D" stroke-width="2"/></g><circle cx="3" cy="3" r="2" fill="%23D4A5C7" opacity="0.9"/></svg>') 0 0, url('https://cdn.nhcarrigan.com/cursors/pointer.cur'), pointer;
transition: all 0.3s ease;
text-transform: none;
font-size: 1.1rem;
letter-spacing: 1px;
transform: rotate(-1deg);
}
button:hover, input[type="submit"]:hover, input[type="button"]:hover {
transform: translateY(-3px) rotate(1deg) scale(1.05);
box-shadow: 0 8px 25px rgba(68, 39, 90, 0.4),
0 0 30px rgba(168, 87, 126, 0.3);
border-color: var(--witch-rose);
}
/* Lists */
ul, ol {
margin-left: 1.5em;
margin-bottom: 1em;
}
ul li::marker {
content: "✦ ";
color: var(--witch-rose);
}
/* Tables */
table {
width: 100%;
border-collapse: collapse;
margin: 1em 0;
border-radius: 8px;
overflow: hidden;
}
th, td {
padding: 12px;
text-align: left;
}
th {
background: var(--witch-plum);
color: var(--witch-moon);
}
tr:nth-child(even) {
background: rgba(212, 165, 199, 0.05);
}
tr:hover {
background: rgba(168, 87, 126, 0.1);
}
/* Blockquotes */
blockquote {
border-left: 5px wavy var(--witch-rose);
padding-left: 20px;
margin: 1em 0;
font-family: 'Griffy', cursive;
font-style: normal;
color: var(--witch-plum);
font-size: 1.2rem;
line-height: 1.8;
background: linear-gradient(90deg,
rgba(168, 87, 126, 0.05) 0%,
transparent 50%);
position: relative;
}
/* Code blocks */
code, pre {
font-family: 'Courier New', monospace;
background: rgba(43, 27, 61, 0.05);
color: var(--witch-purple);
padding: 2px 6px;
border-radius: 4px;
}
pre {
padding: 15px;
overflow-x: auto;
border: 1px solid var(--witch-plum);
}
/* Scrollbar */
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: var(--witch-lavender);
}
::-webkit-scrollbar-thumb {
background: var(--witch-plum);
border-radius: 5px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--witch-purple);
}
/* Selection */
::selection {
background: var(--witch-rose);
color: var(--witch-moon);
}
::-moz-selection {
background: var(--witch-rose);
color: var(--witch-moon);
}
/* Draggable elements */
[draggable="true"] {
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><g transform="translate(12 12)"><path d="M12 2 L2 12 L12 22 L22 12 Z" fill="%232B1B3D"/><circle cx="12" cy="12" r="6" fill="%23A8577E"/><circle cx="12" cy="12" r="4" fill="%23D4A5C7"/><path d="M12 4 L12 0 M12 24 L12 20 M4 12 L0 12 M24 12 L20 12" stroke="%232B1B3D" stroke-width="2"/></g></svg>') 12 12, move;
}
/* Special decorative text classes */
.witchy-accent {
font-family: 'Creepster', cursive;
letter-spacing: 3px;
text-shadow: 3px 3px 0px var(--witch-rose),
4px 4px 8px rgba(168, 87, 126, 0.5);
color: var(--witch-purple);
transform: skew(-5deg);
display: inline-block;
}
.mystical-text {
font-family: 'Henny Penny', 'Vampyr', cursive;
letter-spacing: 2px;
text-shadow: 2px 2px 4px rgba(68, 39, 90, 0.4);
}
.spooky-title {
font-family: 'Creepster', cursive;
background: linear-gradient(45deg,
var(--witch-purple) 0%,
var(--witch-rose) 50%,
var(--witch-mauve) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-shadow: none;
}
@media screen and (max-width: 625px) { @media screen and (max-width: 625px) {
#tree-nation-offset-website { #tree-nation-offset-website {
display: none; display: none;
@@ -266,6 +715,18 @@ a {
margin-bottom: 60px; margin-bottom: 60px;
} }
} }
@media screen and (max-width: 425px) {
#donate-badge {
display: none;
}
}
@media screen and (max-width: 350px) {
footer, #show-socials-button, #theme-select-button, #show-socials-button > i, #theme-select-button > i {
font-size: 10pt;
}
}
`; `;
// #endregion // #endregion
@@ -275,14 +736,14 @@ a {
const nhcarriganHeadersFooter = document.createElement("footer"); const nhcarriganHeadersFooter = document.createElement("footer");
nhcarriganHeadersFooter.innerHTML = ` nhcarriganHeadersFooter.innerHTML = `
<div id="footer-inner-container"> <div id="footer-inner-container">
<p>&copy; <a href="https://nhcarrigan.com" target="_blank">Naomi Carrigan</a></p> <p id="footer-copyright" style="margin: 0; display: flex; align-items: center;">&copy; <a href="https://nhcarrigan.com" target="_blank" style="margin-left: 5px;">Naomi Carrigan</a></p>
<button id="show-socials-button" type="button"> <button id="show-socials-button" type="button">
<i class="fa-solid fa-share-nodes"></i> Connect with Us <i class="fa-solid fa-share-nodes"></i> Connect with Us
</button> </button>
<button id="theme-select-button" type="button"> <button id="theme-select-button" type="button">
<i id="theme-select-icon" class="fa-solid fa-moon"></i> Toggle Theme <i id="theme-select-icon" class="fa-solid fa-moon"></i> Toggle Theme
</button> </button>
<a href="https://buy.stripe.com/cN24iTfqu1j6b3afZ2" target="_blank" rel="noreferrer"> <a id="donate-badge" href="https://buy.stripe.com/cN24iTfqu1j6b3afZ2" target="_blank" rel="noreferrer">
<img src="https://cdn.nhcarrigan.com/donate.png" alt="Donate" style="width: 70px; height: 70px;"> <img src="https://cdn.nhcarrigan.com/donate.png" alt="Donate" style="width: 70px; height: 70px;">
</a> </a>
<div id="tree-nation-offset-website"></div> <div id="tree-nation-offset-website"></div>
@@ -370,29 +831,19 @@ const nhcarriganHeadersFontAwesome = document.createElement("script");
nhcarriganHeadersFontAwesome.src = "https://kit.fontawesome.com/f949111719.js"; nhcarriganHeadersFontAwesome.src = "https://kit.fontawesome.com/f949111719.js";
const nhcarriganHeadersAnalytics = document.createElement("script"); const nhcarriganHeadersAnalytics = document.createElement("script");
nhcarriganHeadersAnalytics.defer = true; nhcarriganHeadersAnalytics.defer = true;
nhcarriganHeadersAnalytics.setAttribute("domain", "nhcarrigan.com");
nhcarriganHeadersAnalytics.src nhcarriganHeadersAnalytics.src
// eslint-disable-next-line stylistic/max-len
= "https://analytics.nhcarrigan.com/js/script.file-downloads.hash.outbound-links.pageview-props.revenue.tagged-events.js"; = "https://analytics.nhcarrigan.com/js/pa-YUXAn1vhhRttySUAw_LMN.js";
nhcarriganHeadersAnalytics.setAttribute(
"event-domain",
nhcarriganHeadersHostname,
);
nhcarriganHeadersAnalytics.setAttribute("data-domain", "nhcarrigan.com");
nhcarriganHeadersAnalytics.setAttribute(
"event-page",
nhcarriganHeadersTitle?.innerText ?? "Unknown Page",
);
nhcarriganHeadersAnalytics.setAttribute(
"event-path",
nhcarriganHeadersPathname,
);
const nhcarriganHeadersAnalytics2 = document.createElement("script"); const nhcarriganHeadersAnalytics2 = document.createElement("script");
nhcarriganHeadersAnalytics2.innerHTML = ` nhcarriganHeadersAnalytics2.innerHTML = `
window.plausible = window.plausible ?? window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
function() { plausible.init({
(window.plausible.q = window.plausible.q ?? []).push(arguments) customProperties: {
} domain: "${nhcarriganHeadersHostname}",
page: "${nhcarriganHeadersTitle?.innerText ?? "Unknown Page"}",
path: "${nhcarriganHeadersPathname}",
},
})
`; `;
const nhcarriganHeadersGoogleAdsense = document.createElement("script"); const nhcarriganHeadersGoogleAdsense = document.createElement("script");
nhcarriganHeadersGoogleAdsense.async = true; nhcarriganHeadersGoogleAdsense.async = true;
@@ -405,23 +856,35 @@ nhcarriganHeadersGoogleAdsense.setAttribute("crossorigin", "anonymous");
// #region Inject Elements // #region Inject Elements
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersCharacterSet);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersViewport);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersThemeColor);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersReferrer);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphTitle); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphTitle);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphDescription); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphDescription);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphImage); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphImage);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphUrl); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphUrl);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphType); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphType);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphSiteName);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphLocale);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphImageAlt);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphImageWidth);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersOpenGraphImageHeight);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterCard); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterCard);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterDomain); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterDomain);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterUrl); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterUrl);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterTitle); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterTitle);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterDescription); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterDescription);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterImage); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterImage);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterSite);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTwitterCreator);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersFavicon); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersFavicon);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersAppleTouchIcon); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersAppleTouchIcon);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersSmallIcon); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersSmallIcon);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersLargeIcon); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersLargeIcon);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersFormatDetection);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersRobots);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersAuthor);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersStyles); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersStyles);
nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTreeNation); nhcarriganHeadersHead?.appendChild(nhcarriganHeadersTreeNation);
@@ -515,23 +978,27 @@ nhcarriganHeadersCta.style.position = "fixed";
nhcarriganHeadersCta.style.top = "50%"; nhcarriganHeadersCta.style.top = "50%";
nhcarriganHeadersCta.style.left = "50%"; nhcarriganHeadersCta.style.left = "50%";
nhcarriganHeadersCta.style.transform = "translate(-50%, -50%)"; nhcarriganHeadersCta.style.transform = "translate(-50%, -50%)";
nhcarriganHeadersCta.style.padding = "10px"; nhcarriganHeadersCta.style.padding = "40px";
nhcarriganHeadersCta.style.borderRadius = "10px"; nhcarriganHeadersCta.style.borderRadius = "20px";
nhcarriganHeadersCta.style.backgroundColor = "var(--background)"; nhcarriganHeadersCta.style.backgroundColor = "var(--witch-moon)";
nhcarriganHeadersCta.style.color = "var(--foreground)"; nhcarriganHeadersCta.style.color = "var(--witch-purple)";
nhcarriganHeadersCta.style.textAlign = "center"; nhcarriganHeadersCta.style.textAlign = "center";
nhcarriganHeadersCta.style.width = "95%"; nhcarriganHeadersCta.style.width = "95%";
nhcarriganHeadersCta.style.maxWidth = "400px"; nhcarriganHeadersCta.style.maxWidth = "400px";
nhcarriganHeadersCta.style.border = "2px solid var(--witch-plum)";
nhcarriganHeadersCta.style.boxShadow = "0 20px 40px rgba(0, 0, 0, 0.5)";
nhcarriganHeadersCta.id = "community-cta"; nhcarriganHeadersCta.id = "community-cta";
nhcarriganHeadersCta.innerHTML = ` nhcarriganHeadersCta.innerHTML = `
<h1 autofocus>Hello~!</h1> <h1 autofocus style="font-size: 2rem; margin-bottom: 20px; color: var(--witch-plum);">Welcome~!</h1>
<div style="display: flex; justify-content: space-around; margin-bottom: 10px;"> <div style="display: flex; justify-content: space-around; margin-bottom: 25px; align-items: center;">
<img src="https://cdn.nhcarrigan.com/logo.png" alt="NHCarrigan Logo" style="width: 100px; height: 100px;"> <img src="https://cdn.nhcarrigan.com/logo.png" alt="NHCarrigan Logo" style="width: 80px; height: 80px;">
<p> <p style="flex: 1; margin-left: 20px; line-height: 1.8;">
Consider joining our community so you can keep up to date on all of our latest activities! Join Naomi's personal Discord community to stay connected with her latest projects and activities!
</p> </p>
</div> </div>
<a href="https://chat.nhcarrigan.com" target="_blank" rel="noreferrer" style="padding: 10px; background: var(--foreground); color: var(--background); outline: none">Okay, take me there~!</a> <a href="https://chat.nhcarrigan.com" target="_blank" rel="noreferrer" style="display: inline-block; padding: 15px 35px; background: linear-gradient(135deg, var(--witch-plum), var(--witch-purple)); color: var(--witch-moon); text-decoration: none; border-radius: 30px; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(68, 39, 90, 0.3);">
Join Naomi's Discord~!
</a>
`; `;
const nhcarriganHeadersModalBg = document.createElement("div"); const nhcarriganHeadersModalBg = document.createElement("div");
@@ -541,7 +1008,8 @@ nhcarriganHeadersModalBg.style.top = "0";
nhcarriganHeadersModalBg.style.left = "0"; nhcarriganHeadersModalBg.style.left = "0";
nhcarriganHeadersModalBg.style.width = "100vw"; nhcarriganHeadersModalBg.style.width = "100vw";
nhcarriganHeadersModalBg.style.height = "100vh"; nhcarriganHeadersModalBg.style.height = "100vh";
nhcarriganHeadersModalBg.style.backgroundColor = "rgba(0, 0, 0, 0.5)"; nhcarriganHeadersModalBg.style.background = "rgba(10, 0, 9, 0.7)";
nhcarriganHeadersModalBg.style.backdropFilter = "blur(5px)";
nhcarriganHeadersModalBg.style.display = "none"; nhcarriganHeadersModalBg.style.display = "none";
nhcarriganHeadersModalBg.id = "modal-bg"; nhcarriganHeadersModalBg.id = "modal-bg";
const nhcarriganHeadersCloseModal = (): void => { const nhcarriganHeadersCloseModal = (): void => {
@@ -592,4 +1060,10 @@ const nhcarriganHeadersShowModal = (): void => {
nhcarriganHeadersBody?.appendChild(nhcarriganHeadersCta); nhcarriganHeadersBody?.appendChild(nhcarriganHeadersCta);
nhcarriganHeadersBody?.appendChild(nhcarriganHeadersModalBg); nhcarriganHeadersBody?.appendChild(nhcarriganHeadersModalBg);
const nhcarriganNoModalUrls = [
"https://forms.nhcarrigan.com/o/docs/forms/7LNb8jFoN4SPBvP7vRxDi2/4",
];
if (!nhcarriganNoModalUrls.includes(nhcarriganHeadersUrl)) {
nhcarriganHeadersShowModal(); nhcarriganHeadersShowModal();
}