commiting

This commit is contained in:
2023-12-15 10:30:18 -05:00
parent b6b7ac2418
commit 5db1626ef1
410 changed files with 52075 additions and 318 deletions

View File

@@ -0,0 +1,49 @@
{% extends "jinja/types/page.html" %}
{% set title %}Contact me{% endset %}
{% block content %}
<div class="row">
<h4>If you have any questions, the
<a href="../faq.html">FAQ</a>
page may have an answer. Contacting me directly by
<a href="mailto: bryant.caregiving@fastmail.com">email</a> or
<a href="tel:+14102799125">text</a> message is welcome.
</h4>
</div>
<div class="row mt-2">
<div class="col-6">
<h3 class="text-center text-primary">
Contact me directly!
</h3>
<a href="tel::+14102799125" class="mr-8">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" fill="currentColor" class="bi bi-telephone-fill" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1.885.511a1.745 1.745 0 0 1 2.61.163L6.29 2.98c.329.423.445.974.315 1.494l-.547 2.19a.678.678 0 0 0 .178.643l2.457 2.457a.678.678 0 0 0 .644.178l2.189-.547a1.745 1.745 0 0 1 1.494.315l2.306 1.794c.829.645.905 1.87.163 2.611l-1.034 1.034c-.74.74-1.846 1.065-2.877.702a18.634 18.634 0 0 1-7.01-4.42 18.634 18.634 0 0 1-4.42-7.009c-.362-1.03-.037-2.137.703-2.877L1.885.511z"/>
</svg>
</a>
<a href="mailto: bryant.caregiving@fastmail.com">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" fill="currentColor" class="bi bi-envelope-fill" viewBox="0 0 16 16">
<path d="M.05 3.555A2 2 0 0 1 2 2h12a2 2 0 0 1 1.95 1.555L8 8.414.05 3.555ZM0 4.697v7.104l5.803-3.558L0 4.697ZM6.761 8.83l-6.57 4.027A2 2 0 0 0 2 14h12a2 2 0 0 0 1.808-1.144l-6.57-4.027L8 9.586l-1.239-.757Zm3.436-.586L16 11.801V4.697l-5.803 3.546Z"/>
</svg>
</a>
</div>
</div>
<div class="row">
<div class="col-4">
<h3 class="text-center text-primary">
Follow me!
</h3>
<a href="https://www.instagram.com/awkawb" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" fill="currentColor" class="bi bi-instagram" viewBox="0 0 16 16">
<path d="M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z"/>
</svg>
</a>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,39 @@
{% extends "jinja/types/page.html" %}
{% set title %}FAQ{% endset %}
{% block content %}
<div class="row text-center">
<h2 class="text-primary">Do you accept more than one animal?</h2>
</div>
<div class="row text-center pb-3">
<h5 class="text-secondary">
I do but all services are priced for one animal. For more than
one pet I charge $8 per additional animal for walking and house
sitting services.
</h5>
</div>
<div class="row text-center">
<h2 class="text-primary">What types of payments do you accept?</h2>
</div>
<div class="row text-center pb-3">
<h5 class="text-secondary">
I accept all major credit cards, bank transfers, and Paypal. Invoices are sent after service is rendered.
</h5>
</div>
<div class="row text-center">
<h2 class="text-primary">Can you clean up my yard, my dog has made it a mess?</h2>
</div>
<div class="row text-center">
<h5 class="text-secondary">
I offer poop clean up as an additional add-on service. If you
decide to schedule a walk or house sitting, I will gladly
remove the poop.
</h5>
</div>
{% endblock %}

View File

@@ -0,0 +1,49 @@
{% extends "jinja/types/page.html" %}
{% set title %}About me{% endset %}
{% block content %}
<div class="row pb-3">
<div class="col-8 text-center">
Welcome to All Paw Care!
</div>
<div class="col-4">
<img class="img-fluid"
src="/static/img/about_me_1_md.jpg"
srcset="/static/img/about_me_1_sm.jpg 540w, /static/img/about_me_1_md.jpg 720w, /static/img/about_me_1_lg.jpg 960w"
sizes="50vw">
</div>
</div>
<div class="row pb-3">
<div class="col-4">
<img class="img-fluid" src="/static/img/about_me_2_lg.jpg"
srcset="/static/img/about_me_2_sm.jpg 540w, /static/img/about_me_2_md.jpg 720w, /static/img/about_me_2_lg.jpg 960w"
sizes="50vw">
</div>
<div class="col-8 text-center">
<p>
I've been providing professional animal caretaking
services in the Baltimore area for over 4 years. I
provide services for paws of all shapes and sizes.
</p>
</div>
</div>
<div class="row">
<div class="col-8 text-center">
<p>
I specialize in dog and cat care. Animals add so much
to our lives so caring for them is just as important.
</p>
</div>
<div class="col-4">
<img class="img-fluid" src="/static/img/about_me_3_lg.jpg"
srcset="/static/img/about_me_3_sm.jpg 540w, /static/img/about_me_3_md.jpg 720w, /static/img/about_me_3_lg.jpg 960w"
sizes="50vw">
</div>
</div>
{% endblock %}

View File

@@ -1,10 +1,14 @@
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
<p class="col-md-4 mb-0 text-muted">
© {{ current_year }} Andrew Bryant
</p>
<footer class="footer mt-5 bg-tertiary">
<div class="container">
<nav class="navbar navbar-expand-sm text-light">
<div class="container">
<p class="col-md-4 mb-0 text-muted">
© {{ current_year }} Andrew Bryant
</p>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
{% include "jinja/menu.html" %}
</nav>
{% include "jinja/menu.html" %}
</div>
</nav>
</div>
</footer>

View File

@@ -1,7 +1,17 @@
<header>
<nav class="navbar navbar-expand-md sticky-top navbar-dark bg-dark">
<div class="container-fluid">
{% include "jinja/menu.html" %}
<nav class="navbar navbar-expand-sm sticky-top bg-light" data-bs-theme="light">
<div class="container">
<button class="navbar-toggler" type="button"
data-bs-toggle="collapse"
data-bs-target="#menu-bar-items"
aria-controls="menu-bar-items"
aria-expanded="false"
aria-label="Toggle menu bar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="menu-bar-items">
{% include "jinja/menu.html" %}
</div>
</div>
</nav>
</header>

View File

@@ -0,0 +1,19 @@
{% for page in pages %}
<li>
{% if title == page %}
<a href="{{ pages[page] }}" class="nav-link text-secondary">
<svg class="bi d-block mx-auto mb-1" width="24" height="24">
<use xlink:href="#home"></use>
</svg>
{{ page }}
</a>
{% else %}
<a href="{{ pages[page] }}" class="nav-link text-white">
<svg class="bi d-block mx-auto mb-1" width="24" height="24">
<use xlink:href="#home"></use>
</svg>
{{ page }}
</a>
{% endif %}
</li>
{% endfor %}

View File

@@ -1,30 +1,30 @@
<ul class="navbar-nav">
<li class="nav-item">
<a href="{{ url_for('pages.home') }}" class="nav-link text-secondary">
<a href="{{ url_for('pages.home') }}" class="nav-link link-white">
Home
</a>
</li>
<li class="nav-item">
<a href="{{ url_for('pages.faq') }}" class="nav-link text-secondary">
<a href="{{ url_for('pages.faq') }}" class="nav-link link-white">
FAQ
</a>
</li>
<li class="nav-item">
<a href="{{ url_for('pages.services') }}" class="nav-link text-secondary">
<a href="{{ url_for('pages.services') }}" class="nav-link link-white">
Services
</a>
</li>
<li class="nav-item">
<a href="{{ url_for('users.user_login') }}" class="nav-link text-secondary">
<a href="{{ url_for('users.user_login') }}" class="nav-link link-white">
Login
</a>
</li>
<li class="nav-item">
<a href="{{ url_for('users.user_create') }}" class="nav-link text-secondary">
<a href="{{ url_for('users.user_create') }}" class="nav-link link-white">
Create account
</a>
</li>

View File

@@ -6,8 +6,7 @@
<title>
{% block title %}{% endblock %}
</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<link href="{{ url_for('static', filename="css/custom.css") }}" rel="stylesheet">
</head>
<body>
{% include "jinja/header.html" %}

View File

@@ -4,15 +4,12 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ title }}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<link href="{{ url_for('static', filename="css/custom.css") }}" rel="stylesheet">
</head>
<body>
<body class="bg-white">
{% include "jinja/header.html" %}
<main>
<hr class="invisible pb-3">
<div class="container">
{% block content %}
{% endblock %}

View File

@@ -0,0 +1,96 @@
{% extends "jinja/types/form.html" %}
{% set title %}Request meet and greet{% endset %}
{% block content %}
<form method="POST">
<h1 class="text-success text-center my-4">Meet & greet</h1>
<div class="d-flex flex-row justify-content-center px-4">
<div class="input-group mx-2">
<span class="input-group-text">Pet name(s)</span>
<input class="form-control" type="text"
placeholder="Tabby, Curly" name="client-pets" id="client-pets" required>
</div>
<div class="input-group mx-2">
<span class="input-group-text">Name</span>
<input class="form-control" type="text"
placeholder="Kasey" name="client-name" id="client-name" required>
</div>
</div>
<div class="d-flex flex-row justify-content-center input-group m-2">
<span class="input-group-text">Visit type</span>
<input class="btn-check" type="radio"
name="visit-type" id="visit-type-walk" required>
<label class="btn btn-primary" for="visit-type-walk">
Walk
</label>
<input class="btn-check" type="radio"
name="visit-type" id="visit-type-sitting">
<label class="btn btn-primary" for="visit-type-sitting">
House sitting
</label>
</div>
<div class="d-flex flex-row justify-content-center m-2">
<div class="col-4 pe-1">
<div class="input-group">
<span class="input-group-text">Date</span>
<input type="date" id="date"
name="meet-greet-date" class="form-control"
placeholder="mm/dd/yyyy" value="" required>
</div>
</div>
<div class="col-4 ps-1">
<div class="input-group">
<span class="input-group-text" id="time">Time</span>
<input type="time" id="meet-greet-time"
name="meet-greet-time" class="form-control"
min="09:00" max="16:00" value="09:00" required>
</div>
</div>
</div>
<div class="d-flex flex-row justify-content-center mx-4 mb-2">
<div class="input-group">
<span class="input-group-text">Contact</span>
<input class="btn-check" type="radio"
name="contact-type" id="email" required>
<label class="btn btn-primary" for="email">
Email
</label>
<input class="btn-check" type="radio"
name="contact-type" id="phone">
<label class="btn btn-primary" for="phone">
Phone
</label>
<input type="text" class="form-control" name="contact"
required>
</div>
</div>
<div class="d-flex flex-row justify-content-center mx-4 mb-2">
<span class="input-group-text">Additional notes</span>
<textarea class="form-control" rows="5" for="notes"
id="notes" name="notes">
</textarea>
</div>
<div class="row m-2">
<button class="btn btn-primary" type="submit"
action="{{ url_for('forms.meet_and_greet') }}" method="post">
Book it
</button>
</div>
</form>
{% endblock %}

View File

@@ -9,28 +9,25 @@
</h1>
</div>
<div class="d-grid gap-3 btn-group-vertical" role="group" id="faq-group">
{% for faq in page.get_content() %}
<div class="row">
<div class="col-1">
</div>
<button class="btn btn-secondary text-light text-center"
type="button"
data-bs-toggle="collapse"
data-bs-target="#{{ page.get_content()[faq]['tag'] }}"
aria-expanded="true"
aria-controls="{{ page.get_content()[faq]['tag'] }}">
<h2 class="accordion-header">
{{ faq }}
</h2>
</button>
<a class="btn btn-primary text-center" data-bs-toggle="collapse"
href="#{{ page.get_content()[faq]['tag'] }}" role="button" aria-expanded="false"
aria-controls="{{ page.get_content()[faq]['tag'] }}">
<h2>{{ faq }}</h2>
</a>
<div class="collapse" id="{{ page.get_content()[faq]['tag'] }}">
<div class="card card-body text-center">
{{ page.get_content()[faq]['answer'] }}
</div>
</div>
<div class="col-1">
<div class="collapse" id="{{ page.get_content()[faq]['tag'] }}">
<div class="card card-body text-center text-secondary">
{{ page.get_content()[faq]['answer']|safe }}
</div>
</div>
<hr class="invisible">
{% endfor %}
</div>
{% endblock %}

View File

@@ -9,30 +9,39 @@
</h1>
</div>
{% for row in page.get_content() %}
<div class="row pb-3">
<div class="col-sm-8 text-center {{ loop.cycle('order-first','order-last') }}">
<p class="text-secondary lead">
{{ page.get_content()[row]['content'] }}
</p>
</div>
<div class="col-sm-4 {{ loop.cycle('order-last','order-first') }}">
<picture>
{% for img in page.get_content()[row]['images'] %}
{% if not loop.last %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(max-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% else %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(min-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% endif %}
{% endfor %}
<div class="d-grid gap-3">
{% for section in page.get_content() %}
<div class="card border-0 d-flex rounded-1 bg-dark">
<div class="card-body">
<div class="row">
<div class="col-sm-8 {{ loop.cycle('order-first','order-last') }}">
<div class="card-text text-light text-center lead">
{{ section['content']|safe }}
</div>
</div>
<div class="col-sm-4 {{ loop.cycle('order-last','order-first') }}">
<div class="card-img">
<picture>
{% for img in section['images'] %}
{% if not loop.last %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(max-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% else %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(min-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% endif %}
{% endfor %}
<img class="img-fluid"
src="{{ url_for('static', filename=page.get_content()[row]['images'][1]) }}">
</picture>
<img class="img-fluid rounded-1"
src="{{ url_for('static', filename=section['images'][1]) }}">
</picture>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -11,60 +11,59 @@
<hr>
{% for section in page.get_content() %}
<div class="row text-center">
<h2 class="text-secondary display-3">
{{ section }}
</h2>
</div>
<div class="row text-center">
<h2 class="text-secondary display-3">
Primary Services
</h2>
</div>
<div class="row pt-2 pb-4">
{% for service in page.get_content()[section] %}
<div class="col-sm-4">
<div class="card">
<picture>
{% for img in service['images'] %}
{% if not loop.last %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(max-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% else %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(min-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% endif %}
<div class="row pt-2 pb-4">
{% for service in page.get_primary_service_cards() %}
<div class="col-sm-4">
<div class="card">
<picture>
{% for img in service.get_images() %}
{% if not loop.last %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(max-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% else %}
<source srcset="{{ url_for('static', filename=img) }}"
media="(min-width: {{ config.IMG_BREAKPOINTS[loop.index] }})" />
{% endif %}
{% endfor %}
<img class="img-fluid card-img-top"
src="{{ url_for('static', filename=service.get_default_image()) }}">
</picture>
<div class="card-body">
<h1 class="card-title text-center text-primary">{{ service.get_title() }}</h1>
<hr>
<h2 class="text-success text-center">
{{ service.get_price() }}
</h2>
<hr class="invisible">
<p class="text-secondary">
Service includes:
<ul>
{% for included in service.get_included() %}
<li>{{ included }}</li>
{% endfor %}
<img class="img-fluid card-img-top"
src="{{ url_for('static', filename=service['images'][1]) }}">
</picture>
<div class="card-body">
<h1 class="card-title text-center text-primary">{{ service['title'] }}</h1>
<hr>
<h2 class="text-success text-center">
{{ service['price'] }}
</h2>
<hr class="invisible">
<p class="text-secondary">
Service includes:
<ul>
{% for included in service['included'] %}
<li>{{ included }}</li>
{% endfor %}
</ul>
</p>
</div>
</div>
</ul>
</p>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
<div class="row">
<div class="btn btn-primary">
<a class="link-light" href="{{ url_for('forms.meet_and_greet') }}">
<a class="link-light" id="request-meet-greet" href="{{ url_for('forms.meet_and_greet') }}">
Request meet & greet
</a>
</div>

View File

@@ -0,0 +1,69 @@
{% extends "jinja/types/page.html" %}
{% set title %}Services{% endset %}
{% block content %}
<div class="row pt-2 pb-4">
<div class="col">
<div class="card">
<img class="img-fluid" class="card-img-top"
src="../static/img/services_dog_walking_card_lg.png"
srcset="../static/img/services_dog_walking_card_sm.png 540w,
../static/img/services_dog_walking_card_md.png 720w,
../static/img/services_dog_walking_card_lg.png 960w,
../static/img/services_dog_walking_card_xl.png 1140w"
sizes="50vw" alt="Woman walking dog">
<div class="card-body">
<h1 class="card-title text-center text-primary">Walking</h1>
<hr>
<h2 class="text-success text-center">$20+/visit</h2>
<hr class="invisible">
<p class="text-secondary">
Service includes 30 minute walk for your pet. Bags for poop
clean-up are included.
</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<img class="img-fluid" class="card-img-top"
src="../static/img/services_house_sitting_card_lg.png"
srcset="../static/img/services_house_sitting_card_sm.png 540w,
../static/img/services_house_sitting_card_md.png 720w,
../static/img/services_house_sitting_card_lg.png 960w,
../static/img/services_house_sitting_card_xl.png 1140w"
sizes="50vw" alt="Dog eating from food bowl">
<div class="card-body">
<h1 class="card-title text-center text-primary">
House sitting
</h1>
<hr>
<h2 class="text-success text-center">$38+/night</h2>
<hr class="invisible">
<p class="text-secondary">
Service includes in-home overnight stays and animal care.
</p>
</div>
</div>
</div>
</div>
<div class="d-flex justify-content-center">
<a href="{{ url_for('forms.meet_and_greet') }}">
<button class="btn btn-primary text-light">
Request meet & greet
</button>
</a>
</div>
{% endblock %}