Compare commits

62 Commits

Author SHA1 Message Date
edsea
9f1e1a8962 Merge branch 'main' of https://vault.corpintech.net/eddie/stellaamor.com
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 3s
2025-11-20 02:41:01 +01:00
edsea
61d3738b26 Add landing pages 2025-11-20 02:40:02 +01:00
Dr3amFury
3c9acc125e update text
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 2s
2025-10-11 21:48:37 +02:00
edsea
aeb1ecd50a Merge branch 'main' of https://vault.corpintech.net/eddie/stellaamor.com
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 2s
2025-10-09 00:36:01 +02:00
edsea
810b033a14 Fix ssl issue 2025-10-09 00:35:50 +02:00
c01baf44d9 Merge pull request 'Test new keywords' (#4) from feature/test123 into main
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 2s
Reviewed-on: #4
2025-10-08 16:05:08 -04:00
edsea
70bde90792 Test new keywords 2025-10-08 22:04:07 +02:00
edsea
f7e691a24c Update keywords
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 2s
2025-10-08 22:02:57 +02:00
edsea
1b4adde2bb Fix htaccess for NPM
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 2s
2025-10-08 16:10:37 +02:00
edsea
9217a71d5a Fix build
All checks were successful
Deploy (stellaamor) / deploy (push) Successful in 2s
2025-10-08 12:04:59 +02:00
edsea
de11388a77 Fix build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 2s
2025-10-08 11:58:54 +02:00
edsea
9ab5fb67a6 Fix build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 1s
2025-10-08 11:55:22 +02:00
edsea
699caf348b Fix build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 1s
2025-10-08 11:41:07 +02:00
edsea
9abdf38a8a Fix build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 0s
2025-10-08 11:38:37 +02:00
edsea
0183f4d027 Fix build 2025-10-08 11:35:10 +02:00
edsea
9d2cb407ff Fix build 2025-10-08 11:33:42 +02:00
edsea
63ee007a48 Fix build
Some checks are pending
Deploy (stellaamor) / deploy (push) Waiting to run
2025-10-08 11:26:46 +02:00
edsea
adf6e3a5b2 First build
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-08 11:12:14 +02:00
edsea
936ff29f56 Fix merge conflict 2025-10-08 11:09:33 +02:00
edsea
5589ebc7b7 First build 2025-10-08 11:08:51 +02:00
929b9b3090 Update .gitea/workflows/deploy.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-08 04:56:18 -04:00
899bc2be76 Update .gitea/workflows/deploy.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-08 04:55:58 -04:00
6a3608fe1f Update .gitea/workflows/deploy.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-08 04:51:15 -04:00
edsea
c08f8a4cfe First build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 1s
2025-10-08 10:49:42 +02:00
edsea
542b62eaf2 First build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 4s
2025-10-08 10:47:09 +02:00
edsea
60131da7a0 First build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 4s
2025-10-08 10:46:08 +02:00
edsea
d08fdbbf64 First build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 3s
2025-10-08 10:43:15 +02:00
edsea
81f852669c First build
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-08 10:38:08 +02:00
edsea
acbda1e8e1 First build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 4s
2025-10-08 10:35:12 +02:00
edsea
18882365a0 Test build
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 4s
2025-10-08 10:30:15 +02:00
5c4de4eeb1 Update .gitea/workflows/deploy.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 4s
2025-10-08 04:22:25 -04:00
edsea
0594026785 Fix merge conflict
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 0s
2025-10-08 10:13:50 +02:00
295793ad7f Update .gitea/workflows/deploy.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Failing after 1s
2025-10-08 04:04:51 -04:00
edsea
420bf997cc remove home from search engines 2025-10-08 09:46:28 +02:00
2eeac785fb Update robots.txt
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-08 03:42:58 -04:00
57968fe74d Update .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:18:38 -04:00
c312697a6e Update .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:16:56 -04:00
33f3552dd8 Update .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:15:42 -04:00
c7e7013fce Update .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:14:22 -04:00
361e0cfb37 Update .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:11:30 -04:00
9be1311a37 Update .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:08:26 -04:00
e63b3cf525 Add .gitea/workflows/smoke.yml
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 18:07:53 -04:00
c9aa00d80f add build YML
Some checks failed
Deploy (stellaamor) / deploy (push) Has been cancelled
2025-10-07 17:55:18 -04:00
edsea
bbd74dade9 Update g-tag 2025-08-16 03:37:41 +02:00
edsea
e5702dd76e repair htaccess 2025-08-13 14:45:39 +02:00
edsea
4c85f23333 Duplicate image for the app 2025-08-13 14:40:54 +02:00
edsea
bccb39b021 Duplicate image for the app 2025-08-13 14:39:20 +02:00
edsea
082093e723 Duplicate image for the app 2025-08-13 14:37:47 +02:00
edsea
da2d882af5 Close properly 2025-08-07 02:11:21 +02:00
5c4f68e7a7 Update gtag 2025-08-06 11:34:58 +00:00
edsea
a8341f43f1 Google 2025-08-06 05:28:07 +02:00
edsea
349d8433d9 Update username from email in login 2025-08-06 05:24:30 +02:00
edsea
54b83c126d Update username from email in login 2025-08-06 05:18:31 +02:00
edsea
a2660be9c0 Update username from email in login 2025-08-06 05:14:00 +02:00
edsea
7dfe83f837 Update username from email in login 2025-08-06 05:11:24 +02:00
edsea
8ec1ba9756 New stella design 2025-08-06 05:09:22 +02:00
edsea
24c3640f05 Merge branch 'main' of github.com:Corpintech/stellaamor.com 2025-08-03 03:59:04 +02:00
edsea
14b3732039 Fix mobile menu 2025-08-03 03:58:52 +02:00
edsea
4a4fa5308e Fix conflicts 2025-08-03 02:50:41 +02:00
edsea
20b56efd31 Fix htaccess 2025-08-03 02:48:35 +02:00
ae966a540e Merge pull request #2 from Corpintech/login-page-update
Add blurred background image
2025-08-03 01:58:31 +02:00
2479570028 Merge pull request #1 from Corpintech/login-page-update
Update login.php layout and content
2025-08-03 00:48:00 +02:00
109 changed files with 3425 additions and 460 deletions

View File

@@ -0,0 +1,86 @@
name: Deploy (stellaamor)
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: [ mainhost ] # must match your runner label (e.g. mainhost:host)
env:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_USER: ${{ secrets.SSH_USER }}
SSH_OPTS: >-
-F /dev/null
-o IdentitiesOnly=yes
-o IdentityAgent=none
-o PreferredAuthentications=publickey
-o PubkeyAuthentication=yes
-o PasswordAuthentication=no
-o NumberOfPasswordPrompts=0
-o BatchMode=yes
-o ServerAliveInterval=15
-o ServerAliveCountMax=3
-o ConnectTimeout=20
-o StrictHostKeyChecking=no
APP_ROOT: /var/www/stellaamor
UPLOADS_DIR: uploads
KEEP_N: "5"
HEALTH_URL: https://stellaamor.com/
SERVICE_RELOAD: "systemctl reload apache2 || true"
SSH_KEY_PATH: /home/gitea-runner/.ssh/id_ed25519
steps:
- name: Checkout (pure git)
run: |
git init
git remote add origin "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY"
git fetch --depth=1 origin "$GITHUB_SHA"
git checkout -q "$GITHUB_SHA"
- name: SSH smoke test
run: ssh $SSH_OPTS -i "$SSH_KEY_PATH" ${SSH_USER}@${SSH_HOST} true
- name: Upload & activate atomically
run: |
set -euo pipefail
REL="$(date -u +%Y%m%d-%H%M%SZ)-${{ github.sha }}"
echo "REL=$REL" >> $GITHUB_ENV
TAR="/tmp/${REL}.tar.gz"
APP="${{ env.APP_ROOT }}"
SHARED="${APP}/shared"
RELEASES="${APP}/releases"
CUR="${APP}/current"
UPLOADS="${{ env.UPLOADS_DIR }}"
tar -czf "$TAR" --exclude-vcs --exclude='./node_modules' --exclude="./${UPLOADS}" --exclude='./release' .
mkdir -p release && mv "$TAR" "release/${REL}.tar.gz"
ssh $SSH_OPTS -i "$SSH_KEY_PATH" ${SSH_USER}@${SSH_HOST} \
"set -e; install -d -m 755 ${RELEASES} ${SHARED} ${SHARED}/${UPLOADS}"
scp -O $SSH_OPTS -vvv -i "$SSH_KEY_PATH" "release/${REL}.tar.gz" ${SSH_USER}@${SSH_HOST}:/tmp/${REL}.tar.gz
ssh $SSH_OPTS -i "$SSH_KEY_PATH" ${SSH_USER}@${SSH_HOST} '
set -euo pipefail
REL="'${REL}'"; APP="'${APP}'"; SHARED="'${SHARED}'"; RELEASES="'${RELEASES}'"; CUR="'${CUR}'"; UPLOADS="'${UPLOADS}'";
NEW="${RELEASES}/${REL}"
mkdir -p "${NEW}"
tar -xzf "/tmp/${REL}.tar.gz" -C "${NEW}" && rm -f "/tmp/${REL}.tar.gz"
rm -rf "${NEW}/${UPLOADS}" && ln -s "${SHARED}/${UPLOADS}" "${NEW}/${UPLOADS}"
[ -f "${SHARED}/.env" ] && ln -sf "${SHARED}/.env" "${NEW}/.env" || true
printf "sha=%s\nbuilt_at=%s\n" "'${{ github.sha }}'" "$(date -u +%FT%TZ)" > "${NEW}/RELEASE"
PREV="$(readlink -f "${CUR}" || true)"
ln -sfn "${NEW}" "${CUR}"
'"${{ env.SERVICE_RELOAD }}"' >/dev/null 2>&1 || true
if command -v curl >/dev/null 2>&1; then
curl -fsS --max-time 5 "'"${{ env.HEALTH_URL }}"'" >/dev/null || {
echo "Health check failed, rolling back..."
[ -n "${PREV}" ] && ln -sfn "${PREV}" "${CUR}" && '"${{ env.SERVICE_RELOAD }}"' >/dev/null 2>&1 || true
exit 1
}
fi
cd "${RELEASES}" && ls -1tr | head -n -'${{ env.KEEP_N }}' | xargs -r -I{} rm -rf "{}"
'

View File

@@ -0,0 +1,47 @@
# manual rollback
on:
workflow_dispatch:
inputs:
steps:
description: "How many releases to roll back (1 = previous)"
default: "1"
jobs:
rollback:
runs-on: [ mainhost ]
env:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_USER: ${{ secrets.SSH_USER }}
SSH_KEY_PATH: /home/gitea-runner/.ssh/id_ed25519
SSH_OPTS: >-
-F /dev/null -o IdentitiesOnly=yes -o IdentityAgent=none
-o PreferredAuthentications=publickey -o PubkeyAuthentication=yes
-o PasswordAuthentication=no -o NumberOfPasswordPrompts=0 -o BatchMode=yes
-o ServerAliveInterval=15 -o ServerAliveCountMax=3 -o ConnectTimeout=20
-o StrictHostKeyChecking=no
APP_ROOT: /var/www/stellaamor
SERVICE_RELOAD: "systemctl reload apache2 || true"
steps:
- name: Roll back symlink to an older release
run: |
set -euo pipefail
APP="${{ env.APP_ROOT }}"
RELEASES="${APP}/releases"
CUR="${APP}/current"
N="${{ github.event.inputs.steps || '1' }}"
# pick target release (1=previous)
TARGET="$(ls -1tr "${RELEASES}" | tail -n +"$((N+1))" | tail -n 1)"
if [ -z "${TARGET}" ]; then
echo "No release found to roll back to."; exit 1
fi
echo "Rolling back to: ${TARGET}"
ssh $SSH_OPTS -i "$SSH_KEY_PATH" ${SSH_USER}@${SSH_HOST} "
set -euo pipefail
APP='${APP}'; RELEASES='${RELEASES}'; CUR='${CUR}'; TARGET='${TARGET}';
[ -d \"\${RELEASES}/\${TARGET}\" ] || { echo 'Target release missing'; exit 1; }
ln -sfn \"\${RELEASES}/\${TARGET}\" \"\${CUR}\"
${SERVICE_RELOAD} >/dev/null 2>&1 || true
"

View File

@@ -0,0 +1,51 @@
name: Smoke (SSH + layout)
on:
workflow_dispatch:
push:
branches: [ "ci/smoke" ]
jobs:
smoke:
runs-on: [ mainhost, docker ]
env:
APP_ROOT: /var/www/stellaamor
UPLOADS_DIR: uploads
steps:
- name: Checkout (pure git)
run: |
git init
git remote add origin "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY"
git fetch --depth=1 origin "$GITHUB_SHA"
git checkout -q "$GITHUB_SHA"
- name: Write SSH key
run: |
set -eu
install -d -m 700 ~/.ssh
printf '%s\n' "${{ secrets.SSH_KEY }}" > ~/.ssh/id_ed25519
# normalize (fix CRLF)
sed -i 's/\r$//' ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
if [ -n "${{ secrets.SSH_KNOWN_HOSTS }}" ]; then
printf '%s\n' "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
else
printf 'StrictHostKeyChecking no\n' >> ~/.ssh/config
fi
- name: Ping server
run: ssh -i ~/.ssh/id_ed25519 ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} 'echo ok'
- name: Ensure layout (no deploy yet)
run: |
ssh -i ~/.ssh/id_ed25519 ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "
set -e
install -d -m 755 ${APP_ROOT}/releases ${APP_ROOT}/shared ${APP_ROOT}/shared/${UPLOADS_DIR}
echo smoke-$(date -u +%FT%TZ) > ${APP_ROOT}/shared/ci-smoke.txt
ls -la ${APP_ROOT} ${APP_ROOT}/shared
"

View File

@@ -1,39 +1,63 @@
# Enable RewriteEngine
RewriteEngine On
RewriteBase /
# Force HTTPS (redirect HTTP to HTTPS)
#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Do NOT rewrite existing files or directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# Redirect www to non-www (if you want to remove www)
RewriteCond %{HTTP_HOST} ^www\.(example\.com)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
# Add trailing slash only to extensionless URLs
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpe?g|gif|svg|webp|ico|woff2?|ttf|eot|json|xml|html|php)$
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.+)$ $1/ [L,R=301]
# Handle 404 errors
ErrorDocument 404 /404
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/index\.php[\s?/] [NC]
RewriteRule ^index\.php$ / [R=301,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/]+)/?$ $1.php [L]
# Rewrite pretty URLs to index.php?page=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ index.php?page=$1 [L,QSA]
# Enable GZip compression
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilterByType DEFLATE text/css text/javascript application/javascript
AddOutputFilterByType DEFLATE application/x-javascript application/json
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/xhtml+xml application/rss+xml
AddOutputFilterByType DEFLATE application/font-woff application/font-woff2
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/svg+xml image/webp
</IfModule>
# Enable browser caching for static assets
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
ExpiresByType application/font-woff2 "access plus 1 year"
</IfModule>
# Security headers
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"
</IfModule>
# Prevent directory listing
Options -Indexes
# BEGIN cPanel-generated php ini directives, do not edit
# Manual editing of this file may result in unexpected behavior.
# To make changes to this file, use the cPanel MultiPHP INI Editor (Home >> Software >> MultiPHP INI Editor)
# For more information, read our documentation (https://go.cpanel.net/EA4ModifyINI)
<IfModule php8_module>
php_value output_buffering Off
</IfModule>
<IfModule lsapi_module>
php_value output_buffering Off
</IfModule>
# END cPanel-generated php ini directives, do not edit
# END cPanel-generated php ini directives, do not edit

9
home/.htaccess Normal file
View File

@@ -0,0 +1,9 @@
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>

View File

@@ -0,0 +1 @@
@import url(https://fonts.googleapis.com/css2?family=Niconne&family=Poly:ital@0;1&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap);#app{font-family:Poppins,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#353535}nav{padding:30px}nav a{font-weight:700;color:#fff}nav a.router-link-exact-active{color:#42b983}.font-niconne{font-family:Niconne,cursive;font-family:Poly,serif}.poppins,body{font-family:Poppins,sans-serif}img{max-width:100%}.main{padding-top:60px}@media(min-width:960px){.main{padding-top:70px}}*{text-align:left}.app-main{margin-top:60px;position:relative;min-height:calc(100vh - 60px)}.top-bar{z-index:10;position:fixed}.loadingScreen{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#ffffffc9;display:flex;justify-content:center;align-items:center;z-index:9}.resetRow{justify-content:flex-end;padding:8px}.filterDrawer{background-color:#fff;z-index:9;height:calc(100% - 60px);padding-top:50px}.filter-header{font-size:18px;font-weight:300;padding-left:5px;padding-bottom:5px;padding-top:20px}.filter-label{font-size:12px;padding-left:15px;margin-bottom:10px;margin-top:10px;display:block}.filter-span{color:#747474;display:block;text-wrap:wrap}.filter-titles{font-size:14px;color:#6d6b6b;font-weight:400;padding-bottom:5px}.list-actions{position:fixed;height:60px;bottom:0;width:100%;padding:0 15px;background:#fff}.filter{padding-bottom:70px}.v-input--selection-controls .v-input__slot>.v-label{font-size:12px}.v-list--dense .v-l,.v-list-item--dense{min-height:30px}.user-age{padding-left:5px;font-size:14px;color:#999}.user-info{color:#666}.user-info ul{list-style:none;padding:0;margin:0}.banner{background-size:cover;background-position:50%;height:350px;background-color:#f7f7f7}.profile-card{margin-top:-100px}.user-info{text-align:center;padding:20px}.user-info h2{margin-bottom:10px}.user-info p{margin:0}.lightbox-arrow{position:absolute;top:50%;width:36px!important;height:36px!important;transform:translateY(-50%);color:#fff!important;background-color:rgba(0,0,0,.5)!important;border-radius:50%!important;box-shadow:0 2px 4px rgba(0,0,0,.3)!important;min-width:unset!important}.lightbox-arrow.left{left:10px}.lightbox-arrow.right{right:10px}.removeImage{top:3px;right:3px;width:18px!important;height:18px!important}.removeImage,.removeImage2{position:absolute;padding:5px!important;color:#e5e5e5!important;background-color:rgba(0,0,0,.5)!important;border-radius:50%!important;box-shadow:0 2px 4px rgba(0,0,0,.3)!important;min-width:unset!important}.removeImage2{top:10px;right:10px;width:30px!important;height:30px!important}.unreadMessages{color:#1976d2!important}.equal-height-row{display:flex;flex-wrap:wrap}.equal-height-card{flex:1 0 auto;display:flex;flex-direction:column}.userInfoListClass{list-style-type:none;padding:0;margin:0;display:flex;flex-wrap:wrap}.userInfoListClass li{width:calc(50% - 20px);margin:10px;padding:15px;border-radius:10px;box-shadow:0 4px 6px rgba(0,0,0,.1);background-color:#fff;transition:background-color .3s ease}.userInfoListClass li:hover{background-color:#f0f0f0}.userInfoListClass li h4{margin-top:0;margin-bottom:10px;font-size:14px;font-weight:400;color:#979797}.userInfoListClass li p{margin-bottom:5px;font-size:12px;color:#919191;line-height:1.4}@media(max-width:768px){.userInfoListClass li{width:calc(100% - 20px)}}.fixedToolbar[data-v-4464b245]{position:fixed;top:0;width:100%}.chat-messages[data-v-4464b245]{padding-top:65px;overflow-y:auto;display:flex;flex-direction:column;height:100%}.chat-message[data-v-4464b245]{margin:10px;padding:10px;border-radius:10px;width:80%}.message-header[data-v-4464b245]{display:flex;align-items:center}.avatar[data-v-4464b245]{width:40px;height:40px;border-radius:50%;margin-right:10px}.username[data-v-4464b245]{font-weight:700;margin-right:10px;cursor:pointer}.message-content[data-v-4464b245]{word-wrap:break-word}.outgoing[data-v-4464b245]{align-self:flex-end;background-color:#2196f3;color:#fff}.incoming[data-v-4464b245]{align-self:flex-start;background-color:#f5f5f5}.sendButton[data-v-4464b245]{display:flex;align-items:center;justify-content:flex-end}.chat-container[data-v-4464b245]{display:flex;flex-direction:column;min-height:100%;justify-content:space-between}.conversation-row[data-v-4464b245]{background-color:#6492f938;padding:10px;margin-bottom:20px;border-radius:12px;cursor:pointer}.conversationTime[data-v-4464b245]{font-size:12px;color:#a3a3a3;right:5px;position:absolute}.conversationUsername[data-v-4464b245]{display:inline;font-weight:500;padding-bottom:5px}.conversation-box[data-v-4464b245]{position:relative}

File diff suppressed because one or more lines are too long

BIN
home/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
home/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
home/img/logo2.9f656f3d.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
home/img/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

5
home/index.html Normal file
View File

@@ -0,0 +1,5 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/x-icon" href="favicon.ico"><title>Stella Amor | Discover Your Dream Date Today</title><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" crossorigin="anonymous"/><link rel="canonical" href="https://stellaamor.com"><link rel="icon" type="image/x-icon" href="favicon.ico"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="description" content="Discover endless possibilities for meaningful connections at Stella Amor, the innovative dating platform designed to cater to every preference. With our comprehensive filtering system, finding your perfect match has never been easier. Explore a diverse community and unlock your path to love and companionship today"><meta property="og:title" content="Stella Amor | Discover Your Dream Date Today"><meta property="og:description" content="Discover endless possibilities for meaningful connections at Stella Amor, the innovative dating platform designed to cater to every preference. With our comprehensive filtering system, finding your perfect match has never been easier. Explore a diverse community and unlock your path to love and companionship today"><meta property="og:image" content="https://api.stellaamor.com/static/logo2.png"><meta property="og:url" content="https://stellaamor.com"><meta property="og:type" content="website"><meta name="twitter:title" content="Stella Amor | Discover Your Dream Date Today"><meta name="twitter:description" content="Discover endless possibilities for meaningful connections at Stella Amor, the innovative dating platform designed to cater to every preference. With our comprehensive filtering system, finding your perfect match has never been easier. Explore a diverse community and unlock your path to love and companionship today"><meta name="twitter:image" content="https://api.stellaamor.com/static/logo2.png"><meta name="twitter:card" content="summary_large_image"><meta name="author" content="Stella Amor"><meta name="keywords" content="Dating"><meta name="robots" content="index,follow"><meta httpequiv="expires" content="0"><meta httpequiv="pragma" content="no-cache"><script defer="defer" src="/home/js/chunk-vendors.644485be.js"></script><script defer="defer" src="/home/js/app.eb118890.js"></script><link href="/home/css/chunk-vendors.0ee1ee54.css" rel="stylesheet"><link href="/home/css/app.5360f6f2.css" rel="stylesheet"></head><script async src="https://www.googletagmanager.com/gtag/js?id=G-486MZV8H9M"></script><script>window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-486MZV8H9M');</script><body><noscript><strong>We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

5
home/index.html.bck Normal file
View File

@@ -0,0 +1,5 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/x-icon" href="favicon.ico"><title>Stella Amor | Discover Your Dream Date Today</title><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" crossorigin="anonymous"/><link rel="canonical" href="https://stellaamor.com"><link rel="icon" type="image/x-icon" href="favicon.ico"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="description" content="Discover endless possibilities for meaningful connections at Stella Amor, the innovative dating platform designed to cater to every preference. With our comprehensive filtering system, finding your perfect match has never been easier. Explore a diverse community and unlock your path to love and companionship today"><meta property="og:title" content="Stella Amor | Discover Your Dream Date Today"><meta property="og:description" content="Discover endless possibilities for meaningful connections at Stella Amor, the innovative dating platform designed to cater to every preference. With our comprehensive filtering system, finding your perfect match has never been easier. Explore a diverse community and unlock your path to love and companionship today"><meta property="og:image" content="https://api.stellaamor.com/static/logo2.png"><meta property="og:url" content="https://stellaamor.com"><meta property="og:type" content="website"><meta name="twitter:title" content="Stella Amor | Discover Your Dream Date Today"><meta name="twitter:description" content="Discover endless possibilities for meaningful connections at Stella Amor, the innovative dating platform designed to cater to every preference. With our comprehensive filtering system, finding your perfect match has never been easier. Explore a diverse community and unlock your path to love and companionship today"><meta name="twitter:image" content="https://api.stellaamor.com/static/logo2.png"><meta name="twitter:card" content="summary_large_image"><meta name="author" content="Stella Amor"><meta name="keywords" content="Dating"><meta name="robots" content="index,follow"><meta httpequiv="expires" content="0"><meta httpequiv="pragma" content="no-cache"><script defer="defer" src="/js/chunk-vendors.644485be.js"></script><script defer="defer" src="/js/app.eb118890.js"></script><link href="/css/chunk-vendors.0ee1ee54.css" rel="stylesheet"><link href="/css/app.5360f6f2.css" rel="stylesheet"></head><script async src="https://www.googletagmanager.com/gtag/js?id=G-486MZV8H9M"></script><script>window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
//
gtag('config', 'G-486MZV8H9M');</script><body><noscript><strong>We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

2
home/js/app.eb118890.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
home/rss/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

BIN
img/logo2.9f656f3d.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
img/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

4
robots.txt Normal file
View File

@@ -0,0 +1,4 @@
User-agent: *
Disallow: /404
Disallow: /home
Sitemap: https://stellaamor.com/sitemap.xml

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

23
rss/3rd-party/mdi/package.json vendored Normal file
View File

@@ -0,0 +1,23 @@
{
"name": "mdi-icons",
"version": "1.0.1",
"description": "This is a library which contains all the material design icons.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"css",
"material",
"mdi",
"design",
"icons",
"vue"
],
"author": "Jatin kamboj",
"repository": "jatin-maropost/mdi-icons",
"license": "ISC",
"devDependencies": {
"@mdi/font": "4.9.95"
}
}

38
rss/3rd-party/mdi/readme.md vendored Normal file
View File

@@ -0,0 +1,38 @@
# Mdi Icons
[![npm (scoped)](https://img.shields.io/badge/npm-v1.0.0-green)](https://www.npmjs.com/package/mdi-icons)
```
npm install --save @mdi-icons
```
> Package is built with [@mdi/font version 4.9.95](https://github.com/Templarian/MaterialDesign-Webfont).
### Useage
Import material design icons css in the **main.js** or root file
```
import "mdi-icons/css/materialdesignicons.min.css";
```
#### Folder Structure
```text
/css
materialdesignicons.min.css
fonts/
materialdesignicons-webfont.eot
materialdesignicons-webfont.ttf
materialdesignicons-webfont.woff
materialdesignicons-webfont.woff2
...
```
## Related Mdi Packages
[NPM @MDI Organization](https://npmjs.com/org/mdi)
- [MaterialDesignIcons.com](https://materialdesignicons.com)
- https://github.com/Templarian/MaterialDesign

View File

@@ -24,12 +24,13 @@ body {
font-family: "Nunito", sans-serif;
font-size: 1.1rem;
line-height: 1.3;
color: #212529;
color: #242627;
background-color: #ffffff;
}
a {
all: inherit;
cursor: pointer;
}
h1, h2, h3, h4, h5, h6 {
@@ -295,11 +296,11 @@ h6, .h6 {
}
.text-dark {
color: #212529 !important;
color: #242627 !important;
}
.bg-dark {
background-color: #212529 !important;
background-color: #242627 !important;
}
.text-white {
@@ -350,6 +351,46 @@ h6, .h6 {
background-color: transparent !important;
}
.text-purple {
color: #540f89 !important;
}
.bg-purple {
background-color: #540f89 !important;
}
.text-dark-red {
color: #1e1717 !important;
}
.bg-dark-red {
background-color: #1e1717 !important;
}
.text-dark-red-alt {
color: rgba(30, 23, 23, 0.6235294118) !important;
}
.bg-dark-red-alt {
background-color: rgba(30, 23, 23, 0.6235294118) !important;
}
.text-dark-purple {
color: #0F172A !important;
}
.bg-dark-purple {
background-color: #0F172A !important;
}
.text-dark-purple-alt {
color: rgba(15, 23, 42, 0.6235294118) !important;
}
.bg-dark-purple-alt {
background-color: rgba(15, 23, 42, 0.6235294118) !important;
}
/* Margin and padding utilities */
.m-0 {
margin: 0 !important;
@@ -1883,7 +1924,7 @@ h6, .h6 {
padding: 0.4rem;
}
.card .card-header.theme-header {
background-color: #212529 !important;
background-color: #242627 !important;
color: rgba(170, 11, 61, 0.6588235294);
}
.card .card-body {
@@ -2114,16 +2155,16 @@ h6, .h6 {
}
.btn-dark {
background-color: #212529;
background-color: #242627;
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.btn-dark:hover {
background-color: rgb(14.8054054054, 16.6, 18.3945945946);
background-color: rgb(16.416, 17.328, 17.784);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-dark:focus-visible {
box-shadow: 0 0 0 3px rgba(33, 37, 41, 0.4);
box-shadow: 0 0 0 3px rgba(36, 38, 39, 0.4);
}
.btn-dark:disabled {
opacity: 0.6;
@@ -2239,6 +2280,96 @@ h6, .h6 {
pointer-events: none;
}
.btn-purple {
background-color: #540f89;
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.btn-purple:hover {
background-color: rgb(61.4526315789, 10.9736842105, 100.2263157895);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-purple:focus-visible {
box-shadow: 0 0 0 3px rgba(84, 15, 137, 0.4);
}
.btn-purple:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-dark-red {
background-color: #1e1717;
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.btn-dark-red:hover {
background-color: rgb(6.9056603774, 5.2943396226, 5.2943396226);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-dark-red:focus-visible {
box-shadow: 0 0 0 3px rgba(30, 23, 23, 0.4);
}
.btn-dark-red:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-dark-red-alt {
background-color: rgba(30, 23, 23, 0.6235294118);
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.btn-dark-red-alt:hover {
background-color: rgba(6.9056603774, 5.2943396226, 5.2943396226, 0.6235294118);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-dark-red-alt:focus-visible {
box-shadow: 0 0 0 3px rgba(30, 23, 23, 0.4);
}
.btn-dark-red-alt:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-dark-purple {
background-color: #0F172A;
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.btn-dark-purple:hover {
background-color: rgb(4.2631578947, 6.5368421053, 11.9368421053);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-dark-purple:focus-visible {
box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.4);
}
.btn-dark-purple:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-dark-purple-alt {
background-color: rgba(15, 23, 42, 0.6235294118);
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.btn-dark-purple-alt:hover {
background-color: rgba(4.2631578947, 6.5368421053, 11.9368421053, 0.6235294118);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-dark-purple-alt:focus-visible {
box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.4);
}
.btn-dark-purple-alt:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
/* Outline buttons */
.btn-outline-primary {
background-color: transparent;
@@ -2413,16 +2544,16 @@ h6, .h6 {
.btn-outline-dark {
background-color: transparent;
border: 2px solid #212529;
color: #212529;
border: 2px solid #242627;
color: #242627;
}
.btn-outline-dark:hover {
background-color: #212529;
background-color: #242627;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-outline-dark:focus-visible {
box-shadow: 0 0 0 3px rgba(33, 37, 41, 0.4);
box-shadow: 0 0 0 3px rgba(36, 38, 39, 0.4);
}
.btn-outline-dark:disabled {
opacity: 0.6;
@@ -2544,6 +2675,101 @@ h6, .h6 {
pointer-events: none;
}
.btn-outline-purple {
background-color: transparent;
border: 2px solid #540f89;
color: #540f89;
}
.btn-outline-purple:hover {
background-color: #540f89;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-outline-purple:focus-visible {
box-shadow: 0 0 0 3px rgba(84, 15, 137, 0.4);
}
.btn-outline-purple:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-outline-dark-red {
background-color: transparent;
border: 2px solid #1e1717;
color: #1e1717;
}
.btn-outline-dark-red:hover {
background-color: #1e1717;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-outline-dark-red:focus-visible {
box-shadow: 0 0 0 3px rgba(30, 23, 23, 0.4);
}
.btn-outline-dark-red:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-outline-dark-red-alt {
background-color: transparent;
border: 2px solid rgba(30, 23, 23, 0.6235294118);
color: rgba(30, 23, 23, 0.6235294118);
}
.btn-outline-dark-red-alt:hover {
background-color: rgba(30, 23, 23, 0.6235294118);
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-outline-dark-red-alt:focus-visible {
box-shadow: 0 0 0 3px rgba(30, 23, 23, 0.4);
}
.btn-outline-dark-red-alt:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-outline-dark-purple {
background-color: transparent;
border: 2px solid #0F172A;
color: #0F172A;
}
.btn-outline-dark-purple:hover {
background-color: #0F172A;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-outline-dark-purple:focus-visible {
box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.4);
}
.btn-outline-dark-purple:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-outline-dark-purple-alt {
background-color: transparent;
border: 2px solid rgba(15, 23, 42, 0.6235294118);
color: rgba(15, 23, 42, 0.6235294118);
}
.btn-outline-dark-purple-alt:hover {
background-color: rgba(15, 23, 42, 0.6235294118);
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.btn-outline-dark-purple-alt:focus-visible {
box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.4);
}
.btn-outline-dark-purple-alt:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
/* Ghost buttons */
.btn-ghost-primary {
background-color: transparent;
@@ -2709,15 +2935,15 @@ h6, .h6 {
.btn-ghost-dark {
background-color: transparent;
color: #212529;
color: #242627;
border: none;
}
.btn-ghost-dark:hover {
background-color: rgba(33, 37, 41, 0.1);
background-color: rgba(36, 38, 39, 0.1);
box-shadow: none;
}
.btn-ghost-dark:focus-visible {
box-shadow: 0 0 0 3px rgba(33, 37, 41, 0.4);
box-shadow: 0 0 0 3px rgba(36, 38, 39, 0.4);
}
.btn-ghost-dark:disabled {
opacity: 0.6;
@@ -2833,6 +3059,96 @@ h6, .h6 {
pointer-events: none;
}
.btn-ghost-purple {
background-color: transparent;
color: #540f89;
border: none;
}
.btn-ghost-purple:hover {
background-color: rgba(84, 15, 137, 0.1);
box-shadow: none;
}
.btn-ghost-purple:focus-visible {
box-shadow: 0 0 0 3px rgba(84, 15, 137, 0.4);
}
.btn-ghost-purple:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-ghost-dark-red {
background-color: transparent;
color: #1e1717;
border: none;
}
.btn-ghost-dark-red:hover {
background-color: rgba(30, 23, 23, 0.1);
box-shadow: none;
}
.btn-ghost-dark-red:focus-visible {
box-shadow: 0 0 0 3px rgba(30, 23, 23, 0.4);
}
.btn-ghost-dark-red:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-ghost-dark-red-alt {
background-color: transparent;
color: rgba(30, 23, 23, 0.6235294118);
border: none;
}
.btn-ghost-dark-red-alt:hover {
background-color: rgba(30, 23, 23, 0.1);
box-shadow: none;
}
.btn-ghost-dark-red-alt:focus-visible {
box-shadow: 0 0 0 3px rgba(30, 23, 23, 0.4);
}
.btn-ghost-dark-red-alt:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-ghost-dark-purple {
background-color: transparent;
color: #0F172A;
border: none;
}
.btn-ghost-dark-purple:hover {
background-color: rgba(15, 23, 42, 0.1);
box-shadow: none;
}
.btn-ghost-dark-purple:focus-visible {
box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.4);
}
.btn-ghost-dark-purple:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.btn-ghost-dark-purple-alt {
background-color: transparent;
color: rgba(15, 23, 42, 0.6235294118);
border: none;
}
.btn-ghost-dark-purple-alt:hover {
background-color: rgba(15, 23, 42, 0.1);
box-shadow: none;
}
.btn-ghost-dark-purple-alt:focus-visible {
box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.4);
}
.btn-ghost-dark-purple-alt:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
.border-0 {
border: 0 solid currentColor;
}
@@ -4733,6 +5049,10 @@ h6, .h6 {
text-decoration: none;
}
.fs-italic {
font-style: italic;
}
.img-w-100 {
width: 100%;
}
@@ -5060,7 +5380,7 @@ input[type=number]:disabled {
.spinner {
height: 1rem;
width: 1rem;
border: 2px solid #212529;
border: 2px solid #242627;
border-left-color: transparent !important;
border-radius: 50%;
display: inline-block;

File diff suppressed because one or more lines are too long

View File

@@ -27,6 +27,7 @@ body {
a{
all: inherit;
cursor: pointer;
}
h1, h2, h3, h4, h5, h6{
@@ -549,6 +550,9 @@ body {
.text-line-through { text-decoration: line-through; }
.text-no-decoration { text-decoration: none; }
// Font styles
.fs-italic{font-style: italic;}
// Image sizing utilities
.img-w-100 { width: 100%; }
.img-w-auto { width: auto; }

View File

@@ -10,18 +10,21 @@
header {
display: flex;
justify-content: space-between;
padding: 0.7rem 2rem;
padding: 1.3rem 2rem;
background-color: #ffffff;
align-items: center;
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.12);
position: relative;
z-index: 999;
font-family: "Nunito", sans-serif;
background-color: #fff;
}
header .logo {
width: 100px;
display: flex;
z-index: 999;
cursor: pointer;
background-color: #fff;
}
header .logo img {
width: 100%;
@@ -30,18 +33,58 @@ header .logo img {
header nav {
display: flex;
position: relative;
z-index: -1;
}
@media (max-width: 768px) {
header nav {
top: -200%;
display: flex;
flex-direction: column;
position: absolute;
opacity: 0;
transition: all 0.3s;
}
header nav.open {
top: 99%;
left: 0;
width: 100%;
transition: all 0.3s;
background-color: #fff;
height: auto;
z-index: -1;
opacity: 1;
transition: all 0.3s;
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.12);
}
header nav.open a {
padding: 7px 10px;
font-size: 16px;
}
}
header nav .menu-item {
color: #000000;
font-weight: 500;
font-weight: 600;
margin-right: 15px;
display: inline-block;
position: relative;
transition: color 0.3s;
font-size: 16px;
font-size: 18px;
}
header nav .menu-item.active {
font-weight: bold;
color: #aa0b3d;
}
header nav .menu-item.active::after {
content: "";
position: absolute;
top: 120%;
left: 0;
height: 2px;
width: 100%;
background: #aa0b3d;
transform: scaleX(1);
transform-origin: left;
transition: transform 0.3s;
}
header nav .menu-item::after {
content: "";
@@ -50,18 +93,28 @@ header nav .menu-item::after {
left: 0;
height: 2px;
width: 100%;
background: #B54418;
background: #aa0b3d;
transform: scaleX(0);
transform-origin: left;
transition: transform 0.3s;
}
header nav .menu-item:hover {
color: #B54418;
color: #aa0b3d;
cursor: pointer;
}
header nav .menu-item:hover::after {
transform: scaleX(1);
}
header .mobile-toggler {
background-color: #fff;
border: none;
font-size: 18px;
}
@media (min-width: 769px) {
header .mobile-toggler {
display: none;
}
}
.home-banner {
height: calc(100vh - 55px);
@@ -71,6 +124,9 @@ header nav .menu-item:hover::after {
opacity: 0;
animation: slideUp 1s ease-in-out forwards;
}
.home-banner.no-height {
height: auto !important;
}
@media (max-width: 768px) {
.home-banner {
height: 100vh;
@@ -171,6 +227,7 @@ header nav .menu-item:hover::after {
height: 100%;
z-index: 1;
opacity: 0.1;
width: 100%;
}
}
.home-banner .home-banner-inner .image-wrapper img {
@@ -191,6 +248,12 @@ header nav .menu-item:hover::after {
background-position: center center;
background-size: cover;
}
.display-banner.kissing-banner {
background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)), url("/rss/img/couple-kissing.jpg");
padding: 180px 0px;
background-position: center center;
background-size: cover;
}
.display-banner.moving-banner {
background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)), url("/rss/img/couple.jpg");
background-position: center 40%;
@@ -199,7 +262,7 @@ header nav .menu-item:hover::after {
}
footer {
background-color: #212529;
background-color: #242627;
color: #fff;
display: flex;
padding: 25px 0px;
@@ -216,7 +279,7 @@ footer ul {
.features-section h2 {
font-size: 1.8rem;
color: #212529;
color: #242627;
}
.features-section .theme-card {
border-radius: 0.25rem;
@@ -288,7 +351,7 @@ footer ul {
font-size: 1.3rem;
font-weight: 500;
margin-bottom: 0.5rem;
color: #212529;
color: #242627;
}
.filter-text {
@@ -369,9 +432,9 @@ section .bolder {
}
.section-animation {
opacity: 0; /* Start hidden */
transform: translateY(50px); /* Slide up from 50px below */
transition: opacity 0.8s ease-out, transform 0.8s ease-out; /* Smooth transition */
opacity: 0;
transform: translateY(50px);
transition: opacity 0.8s ease-out, transform 0.8s ease-out;
}
.section-animation.visible {
@@ -379,7 +442,179 @@ section .bolder {
transform: translateY(0);
}
/* Accessibility for reduced motion */
.user-container {
width: 100%;
height: calc(100vh - 110px);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
}
@media (max-width: 768px) {
.user-container {
height: auto;
padding: 20px 0px;
}
}
@media (max-width: 768px) {
.user-container.alt .user-card {
display: flex;
flex-direction: column-reverse;
}
}
.user-container .user-card {
border-radius: 12px;
background-color: rgba(255, 255, 255, 0.9058823529);
display: flex;
width: 100%;
flex-direction: row;
}
@media (max-width: 768px) {
.user-container .user-card {
flex-direction: column;
height: auto;
}
}
.user-container .user-card .form {
background-color: #FFF;
padding: 20px 0px;
flex: 40%;
max-width: 40%;
display: flex;
align-items: center;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.18);
border-radius: 12px;
}
@media (max-width: 768px) {
.user-container .user-card .form {
flex: 100%;
max-width: 100%;
border-radius: 12px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.16);
}
}
.user-container .user-card .form .user-form {
padding: 10px 15px;
width: 100%;
}
.user-container .user-card .text-col {
flex: 60%;
max-width: 60%;
padding: 30px 20px;
}
@media (max-width: 768px) {
.user-container .user-card .text-col {
flex: 100%;
max-width: 100%;
}
}
.user-container .user-card .text-col .logo {
display: flex;
flex-direction: row;
justify-content: center;
}
.user-container .user-card .text-col .logo img {
width: 180px;
}
.user-container .user-card .text-col .text {
margin-top: 20px;
}
/* PROMO BLOCKS */
.promo-cover {
height: calc(100vh - 60px);
width: 100%;
background-repeat: no-repeat;
background-size: cover;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.promo-cover.fetish-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url("/rss/img/promo-images/bdsm-background.jpeg");
background-position: 50% 35%;
}
.promo-cover.sugar-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url("/rss/img/promo-images/sugar-couple.jpeg");
background-position: 50% 35%;
}
.promo-cover.foot-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url("/rss/img/promo-images/foot1.jpg");
background-position: 50% 35%;
}
.promo-cover.app-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url("/rss/img/promo-images/couple1.jpg");
background-position: 50% 35%;
}
.promo-cover .title-bar {
padding: 20px;
text-align: center;
color: #fff;
width: 100%;
border-radius: 12px;
position: relative;
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.22);
}
@media (min-width: 769px) {
.promo-cover .title-bar {
width: 45%;
}
}
.promo-cover .title-bar h1 {
opacity: 1;
font-weight: 700;
font-size: 2.2rem;
display: inline-block;
}
.promo-cover .title-bar h1::after {
content: "";
display: block;
width: 80%;
height: 1px;
background: #fff;
margin: 2px auto 20px;
border-radius: 2px;
}
.promo-cover .title-bar p {
opacity: 1;
font-weight: 500;
font-size: 1.4rem;
}
.promo-cover .title-bar .cta-btn {
padding: 10px 20px;
background-color: #0F172A;
}
.promo-cover .title-bar .cta-btn:hover {
background-color: rgb(28.4210526316, 43.5789473684, 79.5789473684);
}
.content-section {
padding: 40px 0px;
color: #e2e8f0 !important;
}
.content-section h2 {
font-weight: 700;
font-size: 2rem;
}
.content-section p {
font-size: 1.2rem;
font-weight: 400;
}
.content-section ul {
padding: 0px 40px;
padding-bottom: 10px;
}
.promo-feature-icon {
font-size: 2rem;
display: block;
text-align: center;
color: #ffffff;
}
@media (prefers-reduced-motion: reduce) {
.section-animation {
opacity: 1;

File diff suppressed because one or more lines are too long

View File

@@ -3,18 +3,25 @@
header {
display: flex;
justify-content: space-between;
padding: 0.7rem 2rem;
padding: 1.3rem 2rem;
background-color: #ffffff;
align-items: center;
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.12);
position: relative;
z-index: 999;
font-family: "Nunito", sans-serif;
background-color: #fff;
@media(max-width:768px) {
// height: 48px;
}
.logo {
width: 100px;
display: flex;
z-index: 999;
cursor: pointer;
background-color: #fff;
img {
width: 100%;
@@ -25,19 +32,61 @@ header {
nav {
display: flex;
position: relative;
z-index: -1;
@media(max-width:768px) {
top: -200%;
display: flex;
flex-direction: column;
position: absolute;
opacity: 0;
transition: all 0.3s;
&.open {
top: 99%;
left: 0;
width: 100%;
transition: all 0.3s;
// padding: 5px 10px;
background-color: #fff;
height: auto;
z-index: -1;
opacity: 1;
transition: all 0.3s;
box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.12);
a {
padding: 7px 10px;
font-size: 16px;
}
}
}
.menu-item {
color: #000000;
font-weight: 500;
font-weight: 600;
margin-right: 15px;
display: inline-block;
position: relative;
transition: color 0.3s;
font-size: 16px;
font-size: 18px;
&.active {
font-weight: bold;
// color: #your-brand-color;
color: #{map-get($colors, primary)};
&::after {
content: "";
position: absolute;
top: 120%;
left: 0;
height: 2px;
width: 100%;
background: #{map-get($colors, primary)};
transform: scaleX(1);
transform-origin: left;
transition: transform 0.3s;
}
}
&::after {
@@ -47,14 +96,14 @@ header {
left: 0;
height: 2px;
width: 100%;
background: #B54418;
background: #{map-get($colors, primary)};
transform: scaleX(0);
transform-origin: left;
transition: transform 0.3s;
}
&:hover {
color: #B54418;
color: #{map-get($colors, primary)};
cursor: pointer;
}
@@ -63,131 +112,147 @@ header {
}
}
}
.mobile-toggler {
background-color: #fff;
border: none;
font-size: 18px;
@media(min-width: 769px) {
display: none;
}
}
}
.home-banner {
height: calc(100vh - 55px);
padding: 50px 0;
display: flex;
background-color: #{map-get($colors, white)};
opacity: 0;
animation: slideUp 1s ease-in-out forwards;
// animation-delay: 0.2s;
@media(max-width:768px){
height: 100vh;
}
.home-banner-inner {
flex: 1;
height: calc(100vh - 55px);
padding: 50px 0;
display: flex;
align-items: center;
width: 100%;
background-color: #{map-get($colors, white)};
opacity: 0;
animation: slideUp 1s ease-in-out forwards;
// animation-delay: 0.2s;
.container {
height: 100%;
&.no-height {
height: auto !important;
}
.inner-row {
@media(max-width:768px) {
height: 100vh;
}
.home-banner-inner {
flex: 1;
display: flex;
justify-content: space-between;
align-items: stretch;
height: 100%;
@media(max-width:768px){
flex-direction: column;
}
}
.image-col {
flex: 0 0 45%;
display: flex;
flex-direction: column;
justify-content: center;
img{
border-radius: 12px;
box-shadow: #{map-get($shadows, 3)};
}
}
.text-col {
flex: 0 0 40%;
display: flex;
flex-direction: column;
justify-content: center;
gap: 10px;
@media(max-width: 768px){
flex: 0 0 100%;
max-width: 100%;
text-align: center;
z-index: 9;
}
.title{
font-weight: 800;
font-size: 3.7rem;
line-height: 1.2;
font-family: $font-family-base;
@media(max-width:768px){
font-size: 3.2rem;
}
}
.lead{
font-size: 1.6rem;
font-weight: 400;
@media(max-width:768px){
font-size: 1.3rem;
}
}
.cta-btn{
padding: 10px;
font-size: 1.4rem;
}
.login-text{
display: inline-flex;
gap: 5px;
font-weight: 400;
.login-link{
font-weight: 500;
text-decoration: underline;
cursor: pointer;
}
}
}
.image-wrapper {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
@media(max-width: 768px){
position: absolute;
top: 0;
left: 0;
z-index: 999;
height: 100%;
z-index: 1;
opacity: 0.1;
}
img {
height: 100%;
align-items: center;
width: 100%;
object-fit: cover;
display: block;
}
.container {
height: 100%;
}
.inner-row {
display: flex;
justify-content: space-between;
align-items: stretch;
height: 100%;
@media(max-width:768px) {
flex-direction: column;
}
}
.image-col {
flex: 0 0 45%;
display: flex;
flex-direction: column;
justify-content: center;
img {
border-radius: 12px;
box-shadow: #{map-get($shadows, 3)};
}
}
.text-col {
flex: 0 0 40%;
display: flex;
flex-direction: column;
justify-content: center;
gap: 10px;
@media(max-width: 768px) {
flex: 0 0 100%;
max-width: 100%;
text-align: center;
z-index: 9;
}
.title {
font-weight: 800;
font-size: 3.7rem;
line-height: 1.2;
font-family: $font-family-base;
@media(max-width:768px) {
font-size: 3.2rem;
}
}
.lead {
font-size: 1.6rem;
font-weight: 400;
@media(max-width:768px) {
font-size: 1.3rem;
}
}
.cta-btn {
padding: 10px;
font-size: 1.4rem;
}
.login-text {
display: inline-flex;
gap: 5px;
font-weight: 400;
.login-link {
font-weight: 500;
text-decoration: underline;
cursor: pointer;
}
}
}
.image-wrapper {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
@media(max-width: 768px) {
position: absolute;
top: 0;
left: 0;
z-index: 999;
height: 100%;
z-index: 1;
opacity: 0.1;
width: 100%;
}
img {
height: 100%;
width: 100%;
object-fit: cover;
display: block;
}
}
}
}
}
@@ -205,6 +270,14 @@ header {
background-size: cover;
}
&.kissing-banner {
background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)),
url('/rss/img/couple-kissing.jpg');
padding: 180px 0px;
background-position: center center;
background-size: cover;
}
&.moving-banner {
background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)),
url('/rss/img/couple.jpg');
@@ -257,13 +330,15 @@ footer {
object-fit: cover;
margin: 0 auto;
&.object-left{
&.object-left {
object-position: left center;
}
&.object-center{
&.object-center {
object-position: center center;
}
&.object-bottom{
&.object-bottom {
object-position: bottom center;
}
}
@@ -278,64 +353,66 @@ footer {
// Fix before release
// Theme fonts
.styled-title{
.styled-title {
font-family: "Nunito", sans-serif;
&.fw-900{
&.fw-900 {
font-weight: 900;
}
&.fw-600{
&.fw-600 {
font-weight: 600;
}
}
.filter-section {
padding: 2rem 0;
padding: 2rem 0;
}
.filter-card {
background-color: #{map-get($colors, white)};
border-radius: map-get($border-radius-sizes, md);
box-shadow: map-get($shadows, 2);
padding: #{map-get($spacing, "3")};
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
height: 100%;
margin: 15px 0px;
background-color: #{map-get($colors, white)};
border-radius: map-get($border-radius-sizes, md);
box-shadow: map-get($shadows, 2);
padding: #{map-get($spacing, "3")};
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
height: 100%;
margin: 15px 0px;
}
.filter-icon {
font-size: 2.5rem;
margin-bottom: 1rem;
color: #{map-get($colors, primary)};
font-size: 2.5rem;
margin-bottom: 1rem;
color: #{map-get($colors, primary)};
}
.filter-title {
font-size: 1.3rem;
font-weight: 500;
margin-bottom: 0.5rem;
color: map-get($colors, dark);
font-size: 1.3rem;
font-weight: 500;
margin-bottom: 0.5rem;
color: map-get($colors, dark);
}
.filter-text {
font-size: 1rem;
color: map-get($colors, gray);
line-height: 1.4;
font-size: 1rem;
color: map-get($colors, gray);
line-height: 1.4;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.filter-card {
margin-bottom: 1.5rem;
}
.filter-icon {
font-size: 2rem;
}
.filter-title {
font-size: 1.1rem;
}
.filter-card {
margin-bottom: 1.5rem;
}
.filter-icon {
font-size: 2rem;
}
.filter-title {
font-size: 1.1rem;
}
}
@@ -347,7 +424,7 @@ footer {
// Images
// Rounded col images
.rounded-col-image{
.rounded-col-image {
height: 450px;
width: 450px;
border-radius: 50%;
@@ -357,17 +434,17 @@ footer {
align-items: center;
position: relative;
@media(max-width:1200px){
@media(max-width:1200px) {
width: 300px;
height:300px;
height: 300px;
}
@media(max-width:920px){
width:225px;
@media(max-width:920px) {
width: 225px;
height: 225px;
}
&:before{
&:before {
content: '';
position: absolute;
top: 0;
@@ -383,7 +460,7 @@ footer {
}
img{
img {
object-fit: cover;
object-position: right;
width: 100%;
@@ -391,54 +468,255 @@ footer {
}
}
section{
h2{
section {
h2 {
font-size: 1.8rem;
font-weight: 500;
}
h3{
h3 {
font-size: 1.6rem;
font-weight: 500;
}
p{
p {
font-size: 1.2rem;
font-weight: 400;
line-height: 1.4;
font-weight: 400;
line-height: 1.4;
}
.bolder{
.bolder {
font-weight: 600;
}
}
.section-animation {
opacity: 0; /* Start hidden */
transform: translateY(50px); /* Slide up from 50px below */
transition: opacity 0.8s ease-out, transform 0.8s ease-out; /* Smooth transition */
opacity: 0;
transform: translateY(50px);
transition: opacity 0.8s ease-out, transform 0.8s ease-out;
}
.section-animation.visible {
opacity: 1;
transform: translateY(0);
opacity: 1;
transform: translateY(0);
}
.user-container {
width: 100%;
height: calc(100vh - 110px);
// background-image: url('/rss/img/happy-kissing.jpg');
background-position: center;
background-repeat: no-repeat;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
@media(max-width: 768px) {
height: auto;
padding: 20px 0px;
}
&.alt {
// background-image: url('/rss/img/happy-kissing-2.jpg') !important;
.user-card {
@media(max-width: 768px) {
display: flex;
flex-direction: column-reverse;
}
}
}
.user-card {
border-radius: 12px;
background-color: #ffffffe7;
// box-shadow: #{map-get($shadows, 3)};
display: flex;
// min-height: 60vh;
// height: 60vh;
width: 100%;
flex-direction: row;
// overflow: hidden;
@media(max-width: 768px) {
flex-direction: column;
height: auto;
}
.form {
background-color: #FFF;
padding: 20px 0px;
// height: 100%;
flex: 40%;
max-width: 40%;
display: flex;
align-items: center;
box-shadow: #{map-get($shadows, 3)};
border-radius: 12px;
@media(max-width: 768px) {
flex: 100%;
max-width: 100%;
border-radius: 12px;
box-shadow: #{map-get($shadows, 2)};
}
.user-form {
padding: 10px 15px;
width: 100%;
}
}
.text-col {
flex: 60%;
max-width: 60%;
padding: 30px 20px;
@media(max-width: 768px) {
flex: 100%;
max-width: 100%;
}
.logo {
display: flex;
flex-direction: row;
justify-content: center;
img {
width: 180px;
}
}
.text {
margin-top: 20px;
}
}
}
}
/* PROMO BLOCKS */
.promo-cover {
height: calc(100vh - 60px);
width: 100%;
background-repeat: no-repeat;
background-size: cover;
position: relative;
display: flex;
align-items: center;
justify-content: center;
&.fetish-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url('/rss/img/promo-images/bdsm-background.jpeg');
background-position: 50% 35%;
}
&.sugar-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url('/rss/img/promo-images/sugar-couple.jpeg');
background-position: 50% 35%;
}
&.foot-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url('/rss/img/promo-images/foot1.jpg');
background-position: 50% 35%;
}
&.app-cover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url('/rss/img/promo-images/couple1.jpg');
background-position: 50% 35%;
}
.title-bar {
padding: 20px;
text-align: center;
color: #fff;
width: 100%;
border-radius: 12px;
position: relative;
// background-color: #{map-get($colors, dark-purple-alt)};
box-shadow: #{map-get($shadows, 5)};
@media(min-width:769px) {
width: 45%;
}
h1 {
opacity: 1;
font-weight: 700;
font-size: 2.2rem;
display: inline-block; // necessary to allow width-based pseudo-element
&::after {
content: "";
display: block;
width: 80%;
height: 1px;
background: #fff;
margin: 2px auto 20px;
border-radius: 2px;
}
}
p {
opacity: 1;
font-weight: 500;
font-size: 1.4rem;
}
.cta-btn{
padding: 10px 20px;
background-color: #{map-get($colors, dark-purple)};
&:hover{
background-color: lighten(map-get($colors, dark-purple), 10%);
}
}
}
}
.content-section {
padding: 40px 0px;
color: #e2e8f0 !important;
h2{
font-weight: 700;
font-size:2rem;
}
p{
font-size: 1.2rem;
font-weight: 400;
}
ul {
padding: 0px 40px;
padding-bottom: 10px;
}
}
.promo-feature-icon{
font-size: 2rem;
display: block;
text-align: center;
color: #{map-get($colors, white)};
}
/* Accessibility for reduced motion */
@media (prefers-reduced-motion: reduce) {
.section-animation {
opacity: 1;
transform: none;
transition: none;
}
.section-animation {
opacity: 1;
transform: none;
transition: none;
}
}
@keyframes slideUp {
from {
transform: translateY(50px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
from {
transform: translateY(50px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}

View File

@@ -1 +1 @@
{"version":3,"sources":["variables.scss"],"names":[],"mappings":"AAAA,gBAAA;AAIA,gBAAA;AAmBA,kBAAA;AAGA,kBAAA;AAoBA,kBAAA;AAGA,2BAAA;AAoBA,mBAAA;AAyBA,+BAAA;AAQA,eAAA","file":"variables.css"}
{"version":3,"sources":["variables.scss"],"names":[],"mappings":"AAAA,gBAAA;AAIA,gBAAA;AAmBA,kBAAA;AAGA,kBAAA;AA2BA,kBAAA;AAGA,2BAAA;AAoBA,mBAAA;AAyBA,+BAAA;AAQA,eAAA","file":"variables.css"}

View File

@@ -35,13 +35,20 @@ $colors: (
danger: #dc3545,
info: #0dcaf0,
light: #e5e5e5,
dark: #212529,
dark: #242627,
white: #ffffff,
black: #000000,
muted: #C7C7C7,
accent-white: #f7f7f7,
accent: #08bbbb,
transparent: transparent
transparent: transparent,
// Other colors
purple:#540f89,
dark-red: #1e1717,
dark-red-alt: #1e17179f,
dark-purple: #0F172A,
dark-purple-alt: #0F172A9f,
);
/* Spacing scale */

BIN
rss/img/app-code.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
rss/img/app-date.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
rss/img/app-search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
rss/img/church.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

BIN
rss/img/couple-elder.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

BIN
rss/img/couple-ice.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
rss/img/couple-kissing.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
rss/img/favicon/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -0,0 +1,21 @@
{
"name": "MyWebSite",
"short_name": "MySite",
"icons": [
{
"src": "/rss/favicon/web-app-manifest-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/rss/favicon/web-app-manifest-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
rss/img/happy-kissing-2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

BIN
rss/img/happy-kissing.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

BIN
rss/img/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
rss/img/man-browsing.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

BIN
rss/img/people-couple.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
rss/img/stella.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 KiB

BIN
rss/img/sweden.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

BIN
rss/img/yacht2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

View File

@@ -0,0 +1,81 @@
document.addEventListener('DOMContentLoaded', async (v) =>{
await isAuth();
const loginForm = document.getElementById('loginForm');
loginForm.addEventListener('submit', async (e) =>{
e.preventDefault();
await login();
})
})
// Async login function in vanilla JS
async function login() {
// Set login running state
let loginRunning = true;
let loginError = false;
document.getElementById('loginError').innerText = '';
document.getElementById('loginError').classList.add('d-none');
// Get form data
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const postFields = {
userData: {
username: username,
password: password
},
action: 'login'
};
try {
// Send request
const response = await fetch('https://api.stellaamor.com/users.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify(postFields)
});
const data = await response.json();
if (data.status === 'fail') {
loginError = true;
document.getElementById('loginError').innerText = data.message;
document.getElementById('loginError').classList.remove('d-none');
loginRunning = false;
} else {
loginRunning = false;
setTimeout(() => {
window.location.href = '/home';
document.getElementById('username').value = '';
document.getElementById('password').value = '';
document.getElementById('loginError').innerText = '';
loginRunning = false;
}, 1500);
}
} catch (error) {
loginError = true;
loginRunning = false;
}
}
async function isAuth() {
try {
const response = await fetch('https://api.stellaamor.com/users.php?isAuth=true', {
method: 'GET',
credentials: 'include'
});
const data = await response.json();
if (data.status === true) {
window.location.href = '/home';
} else {
return false;
}
} catch (error) {
return false;
}
}

View File

@@ -73,4 +73,30 @@ async function removeAlert(){
alert.remove();
}
}
}
}
document.addEventListener('DOMContentLoaded', () =>{
document.getElementById('menu-toggler').addEventListener('pointerdown', () =>{
document.getElementById('mainMenu').classList.toggle('open');
})
const sections = document.querySelectorAll('section');
const observer = new IntersectionObserver(
(entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
observer.unobserve(entry.target);
}
});
}, {
threshold: 0.05,
rootMargin: '0px 0px -50px 0px'
}
);
sections.forEach(section => {
section.classList.add('section-animation');
observer.observe(section);
});
});

View File

@@ -1,21 +0,0 @@
document.addEventListener('DOMContentLoaded', async () =>{
await getParams();
})
async function getParams() {
const queryString = window.location.search;
const params = new URLSearchParams(queryString);
const paramsObject = {};
for (const key of params.keys()) {
if (key.endsWith('[]')) {
const cleanKey = key.replace('[]', '');
paramsObject[cleanKey] = params.getAll(key);
} else {
paramsObject[key] = params.get(key);
}
}
return paramsObject;
}

100
rss/js/register.js Normal file
View File

@@ -0,0 +1,100 @@
document.addEventListener('DOMContentLoaded', async (v) => {
const countries = await fetchCountries();
// Handlers
const countrySelector = document.getElementById('userCountry');
for(country of countries){
countrySelector.innerHTML += `<option value="${country.text}">${country.text}</option>`;
}
const signupForm = document.getElementById('signupForm');
signupForm.addEventListener('submit', (e) => {
e.preventDefault();
document.getElementById('errors').innerText = '';
document.getElementById('errors').classList.add('d-none');
// Extract form data
const username = signupForm.querySelector('#username').value;
const dob = signupForm.querySelector('#u_dob').value;
const country = signupForm.querySelector('#userCountry').value;
const gender = signupForm.querySelector('#gender').value;
const email = signupForm.querySelector('#email').value;
const password = signupForm.querySelector('#password').value;
const password2 = signupForm.querySelector('#password2').value;
const tosInput = signupForm.querySelector('#tos');
const tos = tosInput.checked;
// Remove errors
document.getElementById('errors').innerText = null;
let userData = {
username: username,
country: country,
gender: gender,
email: email,
dob: dob,
password: password,
password2: password2,
acceptTerms: tos
};
let action = 'signup';
let formData = JSON.stringify({
action: action,
userData: userData
});
// Send request
fetch('https://api.stellaamor.com/users.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: formData
})
.then(response => {
if(response && response.length){
return response.json();
}else{
return null;
}
})
.then(msg => {
console.log(msg);
// document.getElementById('spinner').classList.remove('show');
if (msg && msg.status === 'fail') {
document.getElementById('errors').innerText = msg.message;
document.getElementById('errors').classList.remove('d-none');
} else {
setTimeout(() => {
window.location.href = '/login/';
}, 2000);
}
})
.catch(error => {
console.error('Error during signup:', error);
document.getElementById('errors').innerText = 'An error occurred. Please try again later.';
});
});
// Call init functions
});
async function fetchCountries() {
try {
const response = await fetch('https://restcountries.com/v3.1/all?fields=name');
const data = await response.json();
const countries = data.map(country => ({
text: country.name.common,
val: country.cca2,
})).sort((a, b) => a.text.localeCompare(b.text));
return countries;
} catch (error) {
console.error('Error fetching countries:', error);
return [];
}
}

View File

@@ -1,8 +1,9 @@
{
"title": "Not found",
"long_desc": "Page or property was not found",
"short_desc": "Page or property was not found",
"title": "404 - Page Not Found",
"long_desc": "Oops! The page youre looking for isnt here. Join Stella Amors free HBTQ-friendly dating platform with advanced filters for kinks, wealth, and lifestyle instead!",
"short_desc": "404 error. Try our free HBTQ-friendly dating filters!",
"template": "404",
"restricted": false,
"redirect_login": false
"redirect_login": false,
"robots": "noindex"
}

View File

@@ -0,0 +1,9 @@
{
"title": "About Our Dating Mission",
"long_desc": "Learn about Stella Amors HBTQ-friendly dating platform. Free advanced filters for kinks, wealth, and lifestyle help you find love. Contact support@stellaamor.com!",
"short_desc": "About Stella Amors free HBTQ-friendly dating mission.",
"template": "about-us",
"restricted": false,
"redirect_login": false,
"robots": "index, follow"
}

View File

@@ -1,8 +1,16 @@
{
"title": "Create account",
"long_desc": "Testing the description!",
"short_desc": "Test desc",
"title": "Join For Free Today",
"long_desc": "Create your free Stella Amor account today! Join our HBTQ-friendly platform with advanced filters for kinks, wealth, and lifestyle to find your perfect match.",
"short_desc": "Create a free HBTQ-friendly dating account.",
"template": "create-account",
"restricted": false,
"redirect_login": true
"redirect_login": false,
"robots": "index, follow",
"rich_service_type": "Online Dating Service",
"rich_offers": {
"name": "Free Membership",
"price": "0",
"description": "Create your profile and access all compatibility filters for free"
}
}

9
rss/json/pages/faq.json Normal file
View File

@@ -0,0 +1,9 @@
{
"title": "Dating FAQs",
"long_desc": "Find answers to questions about Stella Amors free HBTQ-friendly dating platform, advanced filters for kinks and lifestyle, and privacy.",
"short_desc": "FAQs for free HBTQ-friendly dating.",
"template": "faq",
"restricted": false,
"redirect_login": false,
"robots": "index, follow"
}

View File

@@ -0,0 +1,26 @@
{
"title": "Free BDSM & Kink Dating with Detailed Filters",
"long_desc": "Join for free and use detailed BDSM and kink filters to find compatible partners. Match on bondage, dominance, submission, pet play, role-play and 50+ preferences.",
"short_desc": "Free signup. Detailed filters for BDSM, fetish and kink compatibility including dominance/submission, bondage, pet play and 50+ more.",
"template": "dating/fetish-dating",
"restricted": false,
"redirect_login": false,
"robots": "index, follow",
"rich_service_type": "BDSM and Kink Dating",
"rich_faq": [
{
"question": "Is signup and using the BDSM filters free?",
"answer": "Yes. Creating your profile and using all kink and fetish filters is completely free."
},
{
"question": "How private are my kink preferences?",
"answer": "You control visibility. Set any preference to private until you have a mutual match."
},
{
"question": "What specific BDSM and fetish filters are available?",
"answer": "Bondage, dominance/submission roles, impact play, pet play, leather/latex, 24/7 dynamics, safe words, aftercare, role-play and 50+ additional preferences."
}
]
}

View File

@@ -0,0 +1,9 @@
{
"title": "Advanced Dating Filters",
"long_desc": "Explore Stella Amors free HBTQ-friendly dating filters for kinks, wealth, lifestyle, and faith. Find your perfect match with precision and ease!",
"short_desc": "Free HBTQ-friendly filters for kinks, wealth, and lifestyle.",
"template": "filters",
"restricted": false,
"redirect_login": false,
"robots": "index, follow"
}

View File

@@ -0,0 +1,31 @@
{
"title": "Free Foot Fetish Dating with Detailed Filters",
"long_desc": "Join for free and connect with foot lovers worldwide. Use precise filters for foot size, shoe size, pedicure style, worship preferences, and 30+ foot-related interests.",
"short_desc": "Free foot fetish dating with detailed foot size, style and worship filters.",
"template": "dating/foot-fetish-dating",
"restricted": false,
"redirect_login": false,
"robots": "index, follow",
"rich_service_type": "Foot Fetish Dating",
"rich_offers": {
"name": "Free Membership",
"price": "0",
"description": "Create your profile and access all foot fetish filters for free"
},
"rich_faq": [
{
"question": "Is foot fetish dating on Stella Amor free?",
"answer": "Yes. Creating your profile and using all foot-related filters is completely free."
},
{
"question": "How private are my foot preferences?",
"answer": "You control visibility. Keep foot pics and worship preferences private until mutual match."
},
{
"question": "What foot fetish filters are available?",
"answer": "Foot size, shoe size, high arches, pedicure color, nylons vs bare, worship style (massage, kissing, licking), trampling, tickling, and 30+ more."
}
]
}

View File

@@ -0,0 +1,31 @@
{
"title": "Top Free Dating App",
"long_desc": "Stella Amor is a completely free dating app with advanced filters for lifestyle, kinks, wealth, faith, height, and more. No hidden fees, full access from day one.",
"short_desc": "100% free dating app with powerful filters. No credit card required.",
"template": "dating/free-dating-app",
"restricted": false,
"redirect_login": false,
"robots": "index, follow",
"rich_service_type": "Free Dating App",
"rich_offers": {
"name": "Completely Free Membership",
"price": "0",
"description": "Unlimited messaging and all advanced filters"
},
"rich_faq": [
{
"question": "Is Stella Amor really 100% free?",
"answer": "Yes. Registration, messaging, and all filters are completely free with no premium upgrades required."
},
{
"question": "Are there any hidden fees or paywalls?",
"answer": "No. You get full access to every feature from the moment you sign up. No credit card needed."
},
{
"question": "Do I need to pay to message or see matches?",
"answer": "Never. Unlimited messaging and profile viewing are always free."
}
]
}

View File

@@ -0,0 +1,9 @@
{
"title": "How It Works: Free Dating Guide",
"long_desc": "Learn how Stella Amors HBTQ-friendly platform works. Use free advanced filters for kinks, wealth, and lifestyle to find your perfect match in three easy steps!",
"short_desc": "Guide to free HBTQ-friendly dating with advanced filters.",
"template": "how-it-works",
"restricted": false,
"redirect_login": false,
"robots": "index, follow"
}

View File

@@ -1,8 +1,16 @@
{
"title": "Home",
"long_desc": "Testing the description!",
"short_desc": "Test desc",
"title": "Free Dating with Advanced Filters",
"long_desc": "Join Stella Amor for free online dating with advanced filters for kinks, wealth, lifestyle, and faith. Our HBTQ-friendly platform helps you find your perfect match effortlessly!",
"short_desc": "Free HBTQ-friendly dating with filters for kinks and lifestyle.",
"template": "index",
"restricted": false,
"redirect_login": false
"redirect_login": false,
"robots": "index, follow",
"rich_service_type": "Online Dating Service",
"rich_offers": {
"name": "Free Membership",
"price": "0",
"description": "Create your profile and access all compatibility filters for free"
}
}

View File

@@ -1,8 +1,9 @@
{
"title": "Login",
"long_desc": "Testing the description!",
"short_desc": "Test desc",
"title": "Sign In to Free Dating",
"long_desc": "Log in to Stella Amors free HBTQ-friendly dating platform. Access advanced filters for kinks, wealth, and lifestyle to find your perfect match today!",
"short_desc": "Sign in to free HBTQ-friendly dating with advanced filters.",
"template": "login",
"restricted": false,
"redirect_login": true
"redirect_login": true,
"robots": "index, follow"
}

View File

@@ -0,0 +1,9 @@
{
"title": "Join Free Dating",
"long_desc": "Sign up for Stella Amors free HBTQ-friendly dating platform. Use advanced filters for kinks, wealth, and lifestyle to start finding your perfect match today!",
"short_desc": "Join free HBTQ-friendly dating with advanced filters.",
"template": "register",
"restricted": false,
"redirect_login": false,
"robots": "index, follow"
}

View File

@@ -0,0 +1,9 @@
{
"title": "Love Stories: Find Your Match",
"long_desc": "Discover Stella Amors success stories from HBTQ-friendly dating. Users found love with free filters for kinks, wealth, and lifestyle. Join free today!",
"short_desc": "HBTQ-friendly love stories with free dating filters.",
"template": "success-stories",
"restricted": false,
"redirect_login": false,
"robots": "index, follow"
}

View File

@@ -0,0 +1,31 @@
{
"title": "Free Sugar Daddy & Sugar Baby Dating with Financial Filters",
"long_desc": "Join for free and meet generous sugar daddies or attractive sugar babies. Use detailed filters for allowance expectations, net worth, lifestyle, and relationship style.",
"short_desc": "Free sugar daddy and sugar baby dating with precise financial and lifestyle filters.",
"template": "dating/sugar-dating",
"restricted": false,
"redirect_login": false,
"robots": "index, follow",
"rich_service_type": "Sugar Daddy & Sugar Baby Dating",
"rich_offers": {
"name": "Free Membership",
"price": "0",
"description": "Create your profile and access all financial & lifestyle filters for free"
},
"rich_faq": [
{
"question": "Is sugar dating on Stella Amor free to join?",
"answer": "Yes. Creating your profile and using all sugar daddy & sugar baby filters is completely free."
},
{
"question": "How private are my financial preferences and allowance expectations?",
"answer": "You control visibility. Set income, net worth, and allowance details to private until mutual match."
},
{
"question": "What sugar dating filters are available?",
"answer": "Monthly allowance range, net worth, income level, lifestyle budget, relationship type (mentor, travel companion, traditional, platonic, etc.), and 30+ more."
}
]
}

View File

@@ -1,7 +1,7 @@
<?php
global $pageInfo;
if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/js/' . $pageInfo['template'] .'.js')){
echo '<script src="/rss/js/' . $pageInfo['template'] .'.js"></script>';
if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/js/' . $pageInfo['template'] . '.js')) {
echo '<script src="/rss/js/' . $pageInfo['template'] . '.js"></script>';
}
?>
@@ -14,15 +14,20 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/rss/js/' . $pageInfo['template'] .
<div class="col-sm-12 col-md-3">
<h4>Links</h4>
<ul>
<li>Home</li>
<?php foreach ($links as $label => $url): ?>
<li class="mb-2"><a href="<?php echo $url; ?>" class="menu-item<?php echo $label === $currentPage ? ' active" aria-current="page' : ''; ?>"><?php echo htmlspecialchars($label, ENT_QUOTES, 'UTF-8'); ?></a></li>
<?php endforeach; ?>
</ul>
</div>
<div class="col-sm-12 col-md-3">
<h4>Contact</h4>
<ul>
<li>Info</li>
<li><a href="mailto:info@stellaamor.com">info@stellaamor.com</a></li>
<li><a href="mailto:support@stellaamor.com">support@stellaamor.com</a></li>
</ul>
</div>
</div>
</div>
</footer>
</footer>
</body>
</html>

View File

@@ -1,12 +1,34 @@
<?php
$menu = array(
$page = isset($_GET['page']) ? basename($_GET['page']) : 'index';
$jsonFile = $_SERVER['DOCUMENT_ROOT'] . "/rss/json/pages/{$page}.json";
$pageData = file_exists($jsonFile) ? json_decode(file_get_contents($jsonFile), true) : [
'title' => 'Stella Amor',
'long_desc' => 'Free online dating with advanced filters for lifestyle, finance, kinks, and more.',
'robots' => 'index, follow'
];
// Set default values
$siteUrl = 'https://stellaamor.com';
$pageUrl = $page === 'index' ? $siteUrl . '/' : $siteUrl . '/' . $page . '/';
$title = $pageData['title'] ?? 'Stella Amor';
$description = $pageData['long_desc'] ?? 'Free online dating with advanced filters for lifestyle, finance, kinks, and more.';
$keywords = 'free dating, online dating, match filters, financial compatibility, kink-friendly dating, lifestyle matching';
$robots = $pageData['robots'] ?? 'index, follow';
$menu = [
'Home' => '/',
'Create account' => '/create-account',
'Login' => '/login',
'About us' => '/about-us',
);
$pageTitle = htmlspecialchars($pageTitle ?? 'Stella Amor | Free Dating with Ultimate Match Filters', ENT_QUOTES, 'UTF-8');
$pageDescription = htmlspecialchars($pageDescription ?? 'Free dating! Ultimate filters for wealth, kinks, fetishes, & passions. Meet your perfect match now!', ENT_QUOTES, 'UTF-8');
'Create account' => '/register/',
'Login' => '/login/',
'About us' => '/about-us/'
];
$links = [
'Our Filters' => '/filters/',
'Success Stories' => '/success-stories/',
'How It Works' => '/how-it-works/',
'FAQ' => '/faq/',
'About us' => '/about-us/'
];
$currentPage = $page === 'index' ? 'Home' : ucwords(str_replace('-', ' ', $page));
?>
<!DOCTYPE html>
<html lang="en">
@@ -14,35 +36,33 @@ $pageDescription = htmlspecialchars($pageDescription ?? 'Free dating! Ultimate f
<!-- Defaults -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo $pageTitle; ?></title>
<meta name="description" content="<?php echo $pageDescription; ?>">
<title>Stella Amor | <?php echo htmlspecialchars($pageData['title'], ENT_QUOTES, 'UTF-8'); ?></title>
<meta name="description" content="<?php echo htmlspecialchars($description, ENT_QUOTES, 'UTF-8'); ?>">
<meta name="author" content="Stella Amor">
<meta name="keywords" content="free dating, online dating, match filters, finance, kinks, fetishes, lifestyle dating">
<link rel="canonical" href="https://stellaamor.com<?php echo isset($_GET['page']) ? '/' . htmlspecialchars(basename($_GET['page']), ENT_QUOTES, 'UTF-8') : ''; ?>">
<!-- Robots -->
<meta name="robots" content="index, follow">
<meta name="keywords" content="<?php echo htmlspecialchars($keywords, ENT_QUOTES, 'UTF-8'); ?>">
<meta name="robots" content="<?php echo htmlspecialchars($robots, ENT_QUOTES, 'UTF-8'); ?>">
<link rel="canonical" href="<?php echo htmlspecialchars($pageUrl, ENT_QUOTES, 'UTF-8'); ?>">
<!-- Open Graph -->
<meta property="og:title" content="<?php echo $pageTitle; ?>">
<meta property="og:description" content="<?php echo $pageDescription; ?>">
<meta property="og:title" content="<?php echo htmlspecialchars($title, ENT_QUOTES, 'UTF-8'); ?>">
<meta property="og:description" content="<?php echo htmlspecialchars($description, ENT_QUOTES, 'UTF-8'); ?>">
<meta property="og:type" content="website">
<meta property="og:url" content="https://stellaamor.com<?php echo htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES, 'UTF-8'); ?>">
<meta property="og:image" content="https://stellaamor.com/rss/img/logo.png">
<meta property="og:url" content="<?php echo htmlspecialchars($pageUrl, ENT_QUOTES, 'UTF-8'); ?>">
<meta property="og:image" content="<?php echo $siteUrl; ?>/rss/img/stella.png">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="<?php echo $pageTitle; ?>">
<meta name="twitter:description" content="<?php echo $pageDescription; ?>">
<meta name="twitter:image" content="https://stellaamor.com/rss/img/logo.png">
<meta name="twitter:title" content="<?php echo htmlspecialchars($title, ENT_QUOTES, 'UTF-8'); ?>">
<meta name="twitter:description" content="<?php echo htmlspecialchars($description, ENT_QUOTES, 'UTF-8'); ?>">
<meta name="twitter:image" content="<?php echo $siteUrl; ?>/rss/img/stella.png">
<!-- Favicon -->
<link rel="icon" href="/rss/img/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/rss/img/apple-touch-icon.png">
<link rel="icon" href="/rss/img/favicon/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/rss/img/favicon/apple-touch-icon.png">
<!-- Stylesheets -->
<link rel="preload" href="/rss/css/main.css" as="style">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font/css/materialdesignicons.min.css" rel="stylesheet">
<link href="/rss/3rd-party/mdi/css/materialdesignicons.min.css" rel="stylesheet">
<link rel="stylesheet" href="/rss/css/main.css">
<link rel="stylesheet" href="/rss/css/theme.css" media="print" onload="this.media='all'">
@@ -50,33 +70,83 @@ $pageDescription = htmlspecialchars($pageDescription ?? 'Free dating! Ultimate f
<script src="/rss/js/main.js" defer></script>
<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
<!-- Dynamic Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "<?php echo htmlspecialchars($pageInfo['title'], ENT_QUOTES, 'UTF-8'); ?>",
"url": "<?php echo htmlspecialchars($pageUrl, ENT_QUOTES, 'UTF-8'); ?>",
"description": "<?php echo htmlspecialchars($pageInfo['long_desc'] ?? $pageInfo['short_desc'], ENT_QUOTES, 'UTF-8'); ?>",
"isPartOf": {
"@type": "WebSite",
"name": "Stella Amor",
"url": "https://stellaamor.com/"
}
<?php if (!empty($pageInfo['rich_service_type'])): ?>
"mainEntity": {
"@type": "Service",
"serviceType": "<?php echo htmlspecialchars($pageInfo['rich_service_type'], ENT_QUOTES, 'UTF-8'); ?>",
"name": "<?php echo htmlspecialchars($pageInfo['title'], ENT_QUOTES, 'UTF-8'); ?>",
"description": "<?php echo htmlspecialchars($pageInfo['long_desc'] ?? $pageInfo['short_desc'], ENT_QUOTES, 'UTF-8'); ?>",
"provider": {
"@type": "Organization",
"name": "Stella Amor",
"url": "https://stellaamor.com",
"logo": "https://stellaamor.com/rss/img/logo.png",
"description": "Stella Amor: Free online dating with advanced filters for lifestyle, finance, kinks, and more. Find your perfect match today."
"url": "https://stellaamor.com"
},
"areaServed": "Worldwide",
"offers": {
"@type": "Offer",
"name": "Free Membership",
"price": "0",
"priceCurrency": "USD",
"description": "Full access to all filters during the free membership period"
}
</script>
<?php if (!empty($pageInfo['rich_faq'])): ?>
"faqPage": {
"@type": "FAQPage",
"mainEntity": [
<?php foreach ($pageInfo['rich_faq'] as $i => $faq): ?>
{
"@type": "Question",
"name": "<?php echo htmlspecialchars($faq['question'], ENT_QUOTES, 'UTF-8'); ?>",
"acceptedAnswer": {
"@type": "Answer",
"text": "<?php echo htmlspecialchars($faq['answer'], ENT_QUOTES, 'UTF-8'); ?>"
}
}<?php echo $i < count($pageInfo['rich_faq'])-1 ? ',' : ''; ?>
<?php endforeach; ?>
]
}
<?php endif; ?>
}
<?php endif; ?>
}
</script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7LSPWJ1YKX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-7LSPWJ1YKX');
</script>
</head>
<body>
<header>
<div class="logo">
<a href="/">
<img src="/rss/img/logo.png" alt="Stella Amor Logo" width="150" height="50">
<img src="/rss/img/logo.png" alt="Stella Amor Logo" width="150" height="50" loading="lazy">
</a>
</div>
<button class="menu-toggle" aria-label="Toggle navigation">☰</button>
<nav>
<?php
$currentPage = $_SERVER['REQUEST_URI'];
foreach($menu as $name => $link):
$isActive = ($currentPage === $link) ? 'active' : '';
$ariaCurrent = ($currentPage === $link) ? ' aria-current="page"' : '';
?>
<a href="<?php echo $link; ?>" class="menu-item <?php echo $isActive; ?>"<?php echo $ariaCurrent; ?>><?php echo $name; ?></a>
<button class="mobile-toggler" aria-label="Toggle navigation" id="menu-toggler">☰</button>
<nav id="mainMenu">
<?php foreach ($menu as $label => $url): ?>
<a href="<?php echo $url; ?>" class="menu-item<?php echo $label === $currentPage ? ' active" aria-current="page' : ''; ?>">
<?php echo htmlspecialchars($label, ENT_QUOTES, 'UTF-8'); ?>
</a>
<?php endforeach; ?>
</nav>
</header>

View File

@@ -1 +1,15 @@
<h2>This page was not found</h2>
<main>
<div class="home-banner">
<div class="home-banner-inner">
<div class="container">
<div class="d-flex justify-center align-center">
<div class="text-col">
<h1 class="title mb-3">Oops! <span class="text-primary">Page Not Found</span></h1>
<p class="lead mb-3">Looks like this page got lost in the search for love. Dont worry—lets get you back to finding your perfect match!</p>
<a href="/" class="mb-3 btn btn-dark cta-btn">Back to home</a>
</div>
</div>
</div>
</div>
</div>
</main>

View File

@@ -0,0 +1,199 @@
<main>
<div class="home-banner">
<div class="home-banner-inner">
<div class="container">
<div class="inner-row">
<div class="text-col">
<h1 class="title mb-3">About <span class="text-primary">Stella Amor</span></h1>
<p class="lead mb-3">Were redefining online dating with the worlds most advanced filters, free access, and a passion for helping you find your perfect match. A new Nordic Product</p>
<a href="/register/" class="mb-3 btn btn-dark cta-btn">Join Free Now!</a>
</div>
<div class="image-col">
<div class="image-wrapper">
<img src="/rss/img/sweden.jpg" alt="Stella Amor team vision" loading="lazy" class="img-w-100 img-rounded-lg shadow-2">
</div>
</div>
</div>
</div>
</div>
</div>
<section class="mission-section py-4 bg-white">
<div class="container my-5">
<h2 class="mb-4 text-center">Our Mission</h2>
<div class="row align-items-center">
<div class="col-12 col-md-7 flex-column justify-center">
<h3 class="h3 mb-3">Empowering Love with Choice</h3>
<p class="text">At Stella Amor, we believe everyone deserves to find love on their terms. Thats why we created the worlds largest dating filters, letting you match based on finance, kinks, lifestyle, religion, and more. Our free trial and affordable subscriptions ($9.99/month, no binding periods) make personalized dating accessible to all.</p>
<p class="text">Were here to break the mold of generic dating apps, offering a platform where picky singles and professionals can find exactly what theyre looking for, without judgment or limitations.</p>
<div class="d-flex mt-3">
<a href="/register" class="btn btn-dark">Start Your Journey</a>
</div>
</div>
<div class="col-12 col-md-5">
<div class="rounded-col-image">
<img src="/rss/img/couple-elder.jpg" alt="Stella Amors mission for love" loading="lazy">
</div>
</div>
</div>
</div>
</section>
<section class="features-section py-4 bg-accent-white">
<div class="container my-5">
<h2 class="mb-4 text-center">Why Choose Stella Amor?</h2>
<div class="row g-4">
<div class="col-12 col-md-4">
<div class="theme-card primary card-hover">
<div class="card-header theme-header">
<img src="/rss/img/app-search.png" alt="Advanced filters icon" class="rounded-image object-center" loading="lazy">
</div>
<div class="card-body">
<h3 class="h3 fw-light">Unmatched Filters</h3>
<p class="text">From wealth to kinks to family values, our filters let you find exactly who youre looking for.</p>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<div class="theme-card primary card-hover">
<div class="card-header theme-header">
<img src="/rss/img/app-code.png" alt="User-friendly app icon" class="rounded-image object-center" loading="lazy">
</div>
<div class="card-body">
<h3 class="h3 fw-light">User-Friendly App</h3>
<p class="text">Our fast, reliable app works on all devices, making your dating experience seamless.</p>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<div class="theme-card secondary card-hover">
<div class="card-header theme-header">
<img src="/rss/img/app-date.png" alt="Free trial icon" class="rounded-image object-center" loading="lazy">
</div>
<div class="card-body">
<h3 class="h3 fw-light">Free to Start</h3>
<p class="text">Enjoy a full month free with no credit card required, and affordable plans after that.</p>
</div>
</div>
</div>
</div>
</div>
</section>
<section>
<div class="container my-5" id="tos">
<div class="row">
<div class="col-md-6 col-s-12">
<h1>Terms of Use</h1>
<p>These Terms of Use govern your use of Stella Amor. They may change, so review periodically. Contact support@stellaamor.com for questions, with responses within 48 hours.</p>
<h2>1. User Conduct</h2>
<ul>
<li>Respect all users, including HBTQ individuals, at all times. Harassment, hate speech, or abusive behavior will result in account suspension.</li>
<li>Do not impersonate others or create fake profiles to mislead users.</li>
<li>Sharing private user information outside the platform is strictly prohibited.</li>
<li>Spamming, phishing, or malicious activities lead to account termination.</li>
</ul>
<h2>2. Profile Usage</h2>
<ul>
<li>Keep your account credentials secure to protect your privacy.</li>
<li>Uploaded content must not violate copyright, trademark, or privacy laws.</li>
</ul>
<h2>3. Privacy and Data Usage</h2>
<ul>
<li>We prioritize privacy and wont share your data without consent, except as legally required.</li>
<li>By using Stella Amor, you agree to our Privacy Policys data practices.</li>
</ul>
<h2>4. Reporting Issues</h2>
<ul>
<li>Report security vulnerabilities or bugs to support@stellaamor.com immediately, without exploitation.</li>
<li>Report inappropriate behavior or content via platform tools or support@stellaamor.com.</li>
</ul>
<h2>5. Liability</h2>
<ul>
<li>Were not responsible for user actions outside the platform.</li>
<li>Use Stella Amor at your own risk; we dont guarantee match success.</li>
</ul>
<h2>6. Account Termination</h2>
<ul>
<li>We may terminate accounts violating these terms or engaging in prohibited conduct.</li>
<li>Users can terminate accounts anytime via settings.</li>
</ul>
<h2>7. Amendments</h2>
<ul>
<li>Terms may be updated periodically. Continued use signifies acceptance of changes.</li>
<li>No refunds are offered unless required by law. Try our 30-day free trial before subscribing.</li>
<li>No refunds for terminated accounts.</li>
<li>Post-trial subscription is 99 SEK/month, supporting constant platform updates.</li>
</ul>
<h1>Privacy Policy</h1>
<p>Your privacy is our priority at Stella Amor. This policy explains how we collect, use, and protect your data. Contact support@stellaamor.com for concerns, with responses within 48 hours.</p>
<h2>1. Information We Collect</h2>
<ul>
<li><strong>Personal Information:</strong> Name, email, date of birth, and profile details (e.g., kinks, lifestyle) are collected during account creation.</li>
<li><strong>Usage Data:</strong> We track interactions like searches, messages, and matches to improve your experience.</li>
<li><strong>Device Information:</strong> IP address, browser type, and device details may be collected for security.</li>
</ul>
<h2>2. How We Use Your Information</h2>
<ul>
<li>Enhance platform functionality and user experience with constant updates.</li>
<li>Personalize matches for kinks, wealth, or HBTQ-friendly preferences.</li>
<li>Communicate updates, notifications, or support via support@stellaamor.com.</li>
<li>Monitor and improve security to prevent fraud and abuse.</li>
</ul>
<h2>3. Sharing Your Information</h2>
<ul>
<li>We dont sell your data to third parties.</li>
<li>Data may be shared with trusted partners under confidentiality agreements to operate the platform.</li>
<li>Information may be disclosed as required by law or to protect user safety.</li>
</ul>
<h2>4. Data Retention</h2>
<ul>
<li>Data is retained while your account is active or as needed for services.</li>
<li>Data may be kept to comply with legal obligations or resolve disputes.</li>
</ul>
<h2>5. Your Rights</h2>
<ul>
<li>Opt out of marketing communications via account preferences.</li>
<li>Contact support@stellaamor.com with data concerns; we respond within 48 hours.</li>
</ul>
<h2>6. Security</h2>
<ul>
<li>Industry-standard measures protect your data from unauthorized access.</li>
<li>No online service is fully secure; use Stella Amor at your own risk.</li>
</ul>
<h2>7. Changes to This Privacy Policy</h2>
<ul>
<li>We update this policy periodically to meet new requirements. Changes are communicated via platform or email.</li>
<li>Continued use indicates acceptance of updates.</li>
</ul>
</div>
</div>
</div>
</section>
<section class="cta-section py-4 bg-accent-white">
<div class="container">
<div class="flex-column justify-center align-center text-center">
<h2 class="mb-3">Ready to Find Your Perfect Match?</h2>
<p class="text mb-3">Join Stella Amor today and explore love with the worlds most advanced dating filters. No credit card needed!</p>
<a href="/register" class="btn btn-dark cta-btn">Get Started Free</a>
</div>
</div>
</section>
</main>

View File

@@ -0,0 +1,163 @@
<div class="promo-cover fetish-cover">
<div class="title-bar">
<h1>Free BDSM Dating with Detailed Kink Filters</h1>
<p>Discover BDSM-compatible partners using Stella Amors extensive kink and fetish filters. Match on specific interests including bondage, discipline, dominance, submission, sadism, masochism and over 50 additional preferences, all available for free.</p>
<a href="/register/" class="mb-3 btn btn-white">Sign up today</a>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white border-bottom">
<div class="content-section">
<h2>Why BDSM Compatibility Matters in Dating</h2>
<p>Shared kink interests and clear boundaries form the foundation of satisfying BDSM relationships. Stella Amor eliminates guesswork by letting members filter for exact preferences from the start. Whether you identify as dominant, submissive, switch, or explore specific practices such as impact play, shibari, or power exchange, detailed profiles ensure matches align on experience level, limits, and desired dynamics.</p>
<div class="row mt-5">
<div class="col-sm-12 col-md-7">
<h2>Precise BDSM Filters Available on Stella Amor</h2>
<p>Unlike mainstream dating apps that offer only basic orientation checkboxes, Stella Amor provides granular kink filters including:</p>
<ul>
<li>Bondage and rope play preferences</li>
<li>Discipline and punishment styles</li>
<li>Dominance and submission roles</li>
<li>Sadomasochism intensity levels</li>
<li>Safe word and aftercare expectations</li>
<li>Specific fetishes (leather, latex, pet play, and 50+ more)</li>
<li>Experience level from curious beginner to seasoned practitioner</li>
</ul>
<p>All filters are completely free to set and search, with no premium tiers required to access kink-specific matching.</p>
<h2>Safe, Respectful BDSM Dating Environment</h2>
<p>Stella Amor enforces strict community guidelines focused on consent, privacy, and mutual respect. Members can keep kink preferences private until mutually revealed, and verification options help confirm genuine interest in the BDSM lifestyle.</p>
</div>
<div class="col-sm-12 col-md-5">
<img src="/rss/img/promo-images/couple.jpeg" alt="Couple exploring BDSM compatibility on Stella Amor" class="img-w-100 img-rounded-lg shadow-2" loading="lazy">
</div>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark shadow-4">
<div class="container py-4 text-white border-bottom">
<h2 class="text-white fw-semi-bold my-1 py-0 text-center">Top free dating filters for <span class="fw-bold fs-italic">kinks</span> and <span class="fw-bold fs-italic">fetishes</span></h2>
<div class="row py-5">
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-gesture promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Bondage & Shibari</h3>
<p>Match on rope play, suspension, and bondage intensity preferences</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-account-tie promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Dominance & Submission</h3>
<p>Find Dominant, Submissive or Switch partners with clear roles</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-hand promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Impact Play & Spanking</h3>
<p>Filter by spanking, flogging, caning and pain tolerance levels</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-shoe-print promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Leather & Latex Fetish</h3>
<p>Connect with partners who share leather, latex and rubber interests</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-dog promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Pet Play</h3>
<p>Match on puppy, kitten, pony play and handler dynamics</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-gavel promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Discipline & Punishment</h3>
<p>Find partners for rules, protocols, brat taming and consequences</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-eye-off promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>Sensory Play</h3>
<p>Search for blindfolds, sensory deprivation and temperature play</p>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 my-4">
<div class="rounded-xl shadow-2 bg-dark">
<i class="mdi mdi-clock-outline promo-feature-icon"></i>
<div class="text-white text-center px-2 py-1">
<h3>24/7 & Lifestyle Dynamics</h3>
<p>Connect with total power exchange and full-time D/s relationships</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white border-bottom">
<div class="content-section">
<h2>How Stella Amors BDSM Matching Works</h2>
<p>After free registration, members complete a detailed kink questionnaire covering roles, interests, limits, and experience. These answers become searchable filters for everyone. You can require exact matches on must-haves (e.g., “must be dominant” or “must enjoy rope bondage”) and set deal-breakers (e.g., “no needle play”). The algorithm then surfaces only profiles that meet your criteria, saving time and reducing awkward conversations.</p>
<div class="row mt-5">
<div class="col-sm-12 col-md-5">
<img src="/rss/img/promo-images/bd.jpeg" alt="BDSM dating with detailed kink filters on Stella Amor" class="img-w-100 img-rounded-lg shadow-2" loading="lazy">
</div>
<div class="col-sm-12 col-md-7">
<h2>Common BDSM Searches Stella Amor Handles</h2>
<p>Popular search terms our members successfully use include:</p>
<ul>
<li>Female-led relationship (FLR) dating</li>
<li>24/7 dynamics and lifestyle BDSM partners</li>
<li>Brat taming and discipline-focused relationships</li>
<li>Sensory deprivation and impact play partners</li>
<li>Service-oriented submission matching</li>
<li>Age-play and DDLG/MDLB connections</li>
<li>Switch partners open to both dominant and submissive roles</li>
</ul>
<p>All of these preferences and dozens more are built into the free filter system.</p>
<h2>Tips for Better Results on BDSM Dating Profiles</h2>
<p>Complete every kink field the more specific you are, the higher you appear in relevant searches.<br>
Upload clear, recent photos that reflect your style (leather, collars, rope, etc.) while respecting platform clothing guidelines.<br>
Write a short headline that mentions your primary role or interest examples: “Experienced rope top seeking submissive muse” or “Bratty sub looking for patient disciplinarian.<br>
List hard limits upfront to attract compatible matches and filter out mismatches instantly.</p>
</div>
</div>
<div class="text-center mt-5">
<a href="/register/" class="btn btn-white btn-lg px-4 py-2">Create Your Free BDSM Profile Now</a>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,86 @@
<div class="promo-cover foot-cover">
<div class="title-bar">
<h1>Free Foot Fetish Dating with Detailed Filters</h1>
<p>Join for free and meet foot lovers who share your exact preferences. Filter by foot size, pedicure style, worship intensity, nylons, high arches and 30+ foot-specific interests.</p>
<a href="/register/" class="mb-3 btn btn-white">Sign up today</a>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white border-bottom">
<div class="content-section">
<h2>Why Foot Compatibility Matters</h2>
<p>Foot fetish is one of the most common desires. But finding someone with matching tastes can be hard. Stella Amor makes it simple with the most detailed foot filters available anywhere.</p>
<div class="row mt-5">
<div class="col-sm-12 col-md-7">
<h2>Precise Foot Fetish Filters</h2>
<p>Unlike mainstream apps with zero foot options, Stella Amor lets you filter on:</p>
<ul>
<li>Foot size & shoe size</li>
<li>High arches vs flat feet</li>
<li>Pedicure style & nail color</li>
<li>Bare feet vs stockings, socks, nylons</li>
<li>Worship preferences (massage, kissing, licking, smelling)</li>
<li>Trampling, tickling, or foot domination</li>
<li>Clean vs sweaty preference</li>
</ul>
<p>All filters completely free.</p>
<h2>Private & Respectful Community</h2>
<p>Foot pics and detailed preferences stay private until both users agree to share.</p>
</div>
<div class="col-sm-12 col-md-5">
<img src="/rss/img/promo-images/foot2.jpg" alt="Foot fetish dating with detailed foot filters on Stella Amor" class="img-w-100 img-rounded-lg shadow-2" loading="lazy">
</div>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark shadow-4">
<div class="container py-4 text-white border-bottom">
<h2 class="text-white text-center">Top free foot fetish filters</h2>
<div class="row py-5">
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-foot-print promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Foot & Shoe Size</h3><p>Find your perfect size match</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-nail promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Pedicure & Nail Color</h3><p>Red, French, black, or natural</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-sock promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Nylons & Socks</h3><p>Bare, stockings, ankle socks</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-arch promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Arches & Shape</h3><p>High arches, wide, narrow</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-heart-outline promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Worship Style</h3><p>Massage, kissing, licking, smelling</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-shoe-heel promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>High Heels & Flats</h3><p>Stilettos, sandals, barefoot</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-weather-windy promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Clean vs Sweaty</h3><p>Freshly washed or post-gym</p></div></div></div>
<div class="col-sm-12 col-md-3 my-4"><div class="rounded-xl shadow-2 bg-dark"><i class="mdi mdi-human-male-female promo-feature-icon"></i><div class="text-white text-center px-2 py-1"><h3>Trampling & Domination</h3><p>Light stepping to full weight</p></div></div></div>
</div>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white border-bottom">
<div class="content-section">
<h2>How Foot Fetish Matching Works</h2>
<p>After free signup you fill out your exact foot preferences. The system only shows profiles that match what you love no more endless swiping through vanilla feet.</p>
<div class="row mt-5">
<div class="col-sm-12 col-md-5">
<img src="/rss/img/promo-images/foot3.jpg" alt="Foot worship and foot fetish dating on Stella Amor" class="img-w-100 img-rounded-lg shadow-2" loading="lazy">
</div>
<div class="col-sm-12 col-md-7">
<h2>Popular Foot Searches We Cover</h2>
<ul>
<li>Pretty feet dating</li>
<li>Foot worship partners</li>
<li>High arch foot fetish</li>
<li>Size 9-10 feet wanted</li>
<li>Red pedicure foot lovers</li>
<li>Nylon and stocking fetish</li>
<li>Foot massage dating</li>
</ul>
<h2>Profile Tips</h2>
<p>Upload clear foot pics Be specific about size & style Mention worship intensity Verify your feet for extra attention</p>
</div>
</div>
<div class="text-center mt-5">
<a href="/register/" class="btn btn-white btn-lg px-4 py-2">Create Your Free Foot Profile Now</a>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,162 @@
<div class="promo-cover app-cover">
<div class="title-bar">
<h1>Free Dating App With Advanced Filters</h1>
<p>Join the completely free dating app that gives you powerful filters for kinks, lifestyle, wealth, height, faith, polyamory and more. Unlimited messaging included.</p>
<a href="/register/" class="mb-3 btn btn-white btn-lg">Start Free Now</a>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white border-bottom py-5">
<div class="content-section text-center">
<h2 class="display-5">Date Better With Real Free Features</h2>
<p class="lead">Everything you need is included at no cost.</p>
<div class="row mt-5">
<div class="col-md-4 mb-4">
<i class="mdi mdi-message-text-outline display-1 text-danger"></i>
<h3>Unlimited Messaging</h3>
<p>Chat with anyone you match with</p>
</div>
<div class="col-md-4 mb-4">
<i class="mdi mdi-filter-variant display-1 text-danger"></i>
<h3>All Advanced Filters</h3>
<p>Kinks, income, height, religion, lifestyle and dozens more</p>
</div>
<div class="col-md-4 mb-4">
<i class="mdi mdi-shield-check display-1 text-danger"></i>
<h3>Zero Payment Required</h3>
<p>Sign up and start dating right away</p>
</div>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white py-5 text-center">
<h2 class="display-5 mb-4">Stop Wasting Time on Vanilla Dating Apps</h2>
<p class="lead mb-5">
Whether you are looking for kink-friendly partners, sugar dating, polyamory, specific height preferences, fitness lifestyles,
faith-based relationships, or simply someone who matches your exact vibe, Stella Amor gives you the tools to find them fast.
</p>
<div class="row justify-center">
<div class="col-md-8">
<p class="fs-4 mb-4">Join free today and start meeting people who actually fit what you want.</p>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white py-5">
<div class="content-section">
<h2 class="text-center mb-5">Search Exactly What You Want, Completely Free</h2>
<p class="lead text-center mb-5">
Mainstream dating apps give you age and location. Stella Amor gives you real control with the deepest set of free filters available anywhere.
</p>
<div class="row">
<div class="col-md-6 mb-4">
<h4 class="text-danger">Lifestyle & Relationship Style</h4>
<p>Filter for monogamous, polyamory, open relationships, ethical non-monogamy, sugar dating, kink-friendly, vanilla only, 420 friendly, child-free, or wants children.</p>
</div>
<div class="col-md-6 mb-4">
<h4 class="text-danger">Body & Appearance</h4>
<p>Height preferences, body type (slim, athletic, curvy, BBW, dad bod, muscular), hair color, tattoos, piercings, and even foot size or shoe preferences.</p>
</div>
<div class="col-md-6 mb-4">
<h4 class="text-danger">Financial & Success Level</h4>
<p>Income range, net worth, career field, education level, lifestyle budget, and sugar daddy / sugar baby expectations.</p>
</div>
<div class="col-md-6 mb-4">
<h4 class="text-danger">Faith & Values</h4>
<p>Religion, spirituality level, political views, diet (vegan, keto, halal, kosher), smoking and drinking habits.</p>
</div>
<div class="col-md-6 mb-4">
<h4 class="text-danger">Kinks & Bedroom Preferences</h4>
<p>BDSM roles, fetish list, experience level, safe-word usage, aftercare needs, and dozens of specific interests from role-play to sensory play.</p>
</div>
<div class="col-md-6 mb-4">
<h4 class="text-danger">Fitness & Daily Habits</h4>
<p>Gym frequency, sports, outdoor activities, Netflix bingers, early birds, night owls, pet owners, travel frequency.</p>
</div>
</div>
<p class="text-center mt-4 fs-5">Every single filter above is available the moment you join, at no cost.</p>
</div>
</div>
</div>
<div class="w-100 bg-dark shadow-4">
<div class="container py-5 text-white text-center">
<h2>Free Filters You Actually Want</h2>
<div class="row py-4">
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-heart-outline promo-feature-icon"></i><h4>Kinks & Fetishes</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-cash-multiple promo-feature-icon"></i><h4>Wealth & Income</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-human-male-female promo-feature-icon"></i><h4>Height & Body</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-account-group promo-feature-icon"></i><h4>Poly & Open</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-foot-print promo-feature-icon"></i><h4>Foot Preferences</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-star-outline promo-feature-icon"></i><h4>Sugar Dating</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-church promo-feature-icon"></i><h4>Faith</h4></div></div>
<div class="col-6 col-md-3 my-4"><div class="bg-dark rounded-xl shadow-2 p-4"><i class="mdi mdi-run-fast promo-feature-icon"></i><h4>Fitness</h4></div></div>
</div>
<p class="lead">All filters included free</p>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white py-5">
<div class="content-section">
<h2 class="text-center mb-5">What Makes Stella Amor Different</h2>
<div class="row text-center">
<div class="col-md-4 mb-4">
<i class="mdi mdi-filter-variant display-1 text-danger mb-3"></i>
<h4>Most Detailed Filters Anywhere</h4>
<p>Kinks, income, height, faith, body type, relationship style and dozens more. Find exactly what you are looking for from day one.</p>
</div>
<div class="col-md-4 mb-4">
<i class="mdi mdi-message-text-outline display-1 text-danger mb-3"></i>
<h4>Unlimited Messaging</h4>
<p>Chat with every match you like, no limits and no extra cost.</p>
</div>
<div class="col-md-4 mb-4">
<i class="mdi mdi-cellphone display-1 text-danger mb-3"></i>
<h4>Works Everywhere</h4>
<p>Perfect experience on phone, tablet, or desktop. No separate app download needed.</p>
</div>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white py-5">
<div class="content-section">
<h2 class="text-center mb-5">From Sign-Up to Real Dates in Three Simple Steps</h2>
<div class="row align-items-center justify-content-center text-center text-md-start">
<div class="col-md-4 mb-5">
<div class="display-1 text-danger mb-3">1</div>
<h4>Create Your Free Profile</h4>
<p>Takes under one minute. Add photos, write a short bio, and answer the questions that matter most to you.</p>
</div>
<div class="col-md-4 mb-5">
<div class="display-1 text-danger mb-3">2</div>
<h4>Set Your Exact Filters</h4>
<p>Tell the system who you want and who you dont. Be as specific as you like the more precise you are, the better your matches.</p>
</div>
<div class="col-md-4 mb-5">
<div class="display-1 text-danger mb-3">3</div>
<h4>Start Messaging Matches</h4>
<p>Browse only people who already fit what you are looking for. Message anyone you like, as many times as you want.</p>
</div>
</div>
</div>
</div>
</div>
<div class="w-100 bg-dark">
<div class="container text-white py-5 text-center">
<h2>Join Free In Seconds</h2>
<p class="lead mb-5">No card, no catch, just dating</p>
<a href="/register/" class="btn btn-white btn-lg px-5">Start Free Dating Now</a>
</div>
</div>

Some files were not shown because too many files have changed in this diff Show More