Feat(UI): Blog Home page as standalone view file.

This commit is contained in:
2025-08-09 15:06:40 +01:00
parent 77393d2057
commit 2541aaf849
23 changed files with 4054 additions and 12 deletions

2
app.py
View File

@@ -20,6 +20,7 @@ from config import app_config, Config
from controllers.core.home import routes_core_home
from controllers.core.contact import routes_core_contact
from controllers.core.apply_founding_partner import routes_core_apply_founding_partner
from controllers.blog.blog import routes_blog
from controllers.dog.assessment import routes_dog_assessment
from controllers.dog.button_icon import routes_dog_button_icon
from controllers.dog.calendar_entry import routes_dog_calendar_entry
@@ -124,6 +125,7 @@ with app.app_context():
app.register_blueprint(routes_core_home)
app.register_blueprint(routes_core_contact)
app.register_blueprint(routes_core_apply_founding_partner)
app.register_blueprint(routes_blog)
app.register_blueprint(routes_dog)
app.register_blueprint(routes_dog_command)
app.register_blueprint(routes_dog_command_category)

31
controllers/blog/blog.py Normal file
View File

@@ -0,0 +1,31 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: App Routing
Feature: Blog - Home Routes
Description:
Home Page Controller.
"""
# internal
from business_objects.api import API
from models.model_view_blog_home import Model_View_Blog_Home
# external
from flask import render_template, jsonify, Blueprint, send_from_directory
routes_blog = Blueprint('routes_blog', __name__)
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_HOME, methods=['GET'])
def blog_home():
try:
model = Model_View_Blog_Home()
html_body = render_template('layouts/layout_blog.html', model = model) # 'pages/blog/_home.html'
except Exception as e:
return jsonify(error=str(e)), 403
return html_body

View File

@@ -213,6 +213,12 @@ class Model_View_Base(BaseModel, ABC):
# FLAG_NAME_SINGULAR: ClassVar[str] = Base.FLAG_NAME_SINGULAR
FLAG_NAV_ADMIN_HOME: ClassVar[str] = 'navAdminHome'
FLAG_NAV_APPLY_FOUNDING_PARTNER: ClassVar[str] = 'navApplyFoundingPartner'
FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS: ClassVar[str] = 'navBlogArticleHowToScaleYourDogTrainingBusiness'
FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS: ClassVar[str] = 'navBlogArticleTheScienceBehindDogTrainingAssessments'
FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY: ClassVar[str] = 'navBlogArticleWhyEveryTrainerNeedsACommandDictionary'
FLAG_NAV_BLOG_CATEGORY_MARKETING_AND_GROWTH: ClassVar[str] = 'navBlogCategoryMarketingAndGrowth'
FLAG_NAV_BLOG_CATEGORY_TRAINING_TECHNIQUES: ClassVar[str] = 'navBlogCategoryTrainingTechniques'
FLAG_NAV_BLOG_HOME: ClassVar[str] = 'navBlogHome'
FLAG_NAV_CONTACT: ClassVar[str] = 'navContact'
FLAG_NAV_DOG_ASSESSMENT: ClassVar[str] = 'navDogAssessment'
FLAG_NAV_DOG_ASSESSMENTS: ClassVar[str] = 'navDogAssessments'
@@ -266,7 +272,13 @@ class Model_View_Base(BaseModel, ABC):
HASH_PAGE_ACCESSIBILITY_STATEMENT: ClassVar[str] = '/accessibility-statement'
HASH_PAGE_ADMIN_HOME: ClassVar[str] = '/admin'
HASH_PAGE_APPLY_FOUNDING_PARTNER: ClassVar[str] = '/apply-founding-partner'
HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS: ClassVar[str] = '/apply-founding-partner-success'
HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS: ClassVar[str] = '/apply-founding-partner-success'#
HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS: ClassVar[str] = '/blog/article/how-to-scale-your-dog-training-business-from-solo-to-multi-trainer-success'
HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS: ClassVar[str] = '/blog/article/the-science-behind-dog-training-assessments-how-to-track-real-progress'
HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY: ClassVar[str] = '/blog/article/why-every-professional-trainer-needs-a-command-dictionary-in-2025'
HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH: ClassVar[str] = '/blog/category/marketing-and-growth'
HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES: ClassVar[str] = '/blog/category/training-techniques'
HASH_PAGE_BLOG_HOME: ClassVar[str] = '/blog/home'
HASH_PAGE_CONTACT: ClassVar[str] = '/contact'
HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success'
HASH_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = '/retention-schedule'
@@ -334,6 +346,7 @@ class Model_View_Base(BaseModel, ABC):
URL_GITHUB: ClassVar[str] = f'https://github.com/{USERNAME_GITHUB}'
URL_INSTAGRAM: ClassVar[str] = f'https://www.instagram.com/{USERNAME_INSTAGRAM}/'
URL_LINKEDIN: ClassVar[str] = f'https://www.linkedin.com/company/{USERNAME_LINKEDIN}'
URL_LINKEDIN_PERSONAL: ClassVar[str] = f'https://www.linkedin.com/in/teddyms'
URL_REDDIT: ClassVar[str] = f'https://www.reddit.com/u/{USERNAME_REDDIT}/s/gZKEz2ZwHN'
URL_TIKTOK: ClassVar[str] = f'https://www.tiktok.com/@{USERNAME_TIKTOK}'
URL_TWITTER: ClassVar[str] = f'https://x.com/{USERNAME_TWITTER}'

View File

@@ -0,0 +1,25 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Blog View Models
Feature: Home View Model
Description:
Data model for home view
"""
# internal
from models.model_view_base import Model_View_Base
# from routes import bp_home
# external
from typing import ClassVar
class Model_View_Blog_Home(Model_View_Base):
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_BLOG_HOME):
super().__init__(hash_page_current=hash_page_current)
self._title = 'Blog Home'

View File

@@ -0,0 +1,527 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8f9fa;
}
/* Header */
.header {
background: linear-gradient(135deg, #2c5282 0%, #3182ce 100%);
color: white;
padding: 1rem 0;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
color: #ff6b35;
}
.nav-links {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-links a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.nav-links a:hover {
color: #ff6b35;
}
/* Breadcrumb */
.breadcrumb {
background: white;
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.breadcrumb-nav {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9rem;
color: #666;
}
.breadcrumb-nav a {
color: #3182ce;
text-decoration: none;
}
.breadcrumb-nav a:hover {
text-decoration: underline;
}
/* Main Content */
.main-content {
padding: 3rem 0;
}
.content-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 3rem;
}
/* Article */
.article {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.article-header {
padding: 2rem 2rem 1rem;
}
.article-category {
display: inline-block;
background: #ff6b35;
color: white;
padding: 0.4rem 1.2rem;
border-radius: 25px;
font-size: 0.9rem;
font-weight: 600;
margin-bottom: 1.5rem;
}
.article-title {
font-size: 2.2rem;
color: #2d3748;
line-height: 1.3;
margin-bottom: 1.5rem;
}
.article-meta {
display: flex;
align-items: center;
gap: 2rem;
padding-bottom: 1.5rem;
border-bottom: 2px solid #e2e8f0;
margin-bottom: 2rem;
}
.meta-item {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.95rem;
color: #666;
}
.author-info {
display: flex;
align-items: center;
gap: 1rem;
}
.author-avatar {
width: 50px;
height: 50px;
border-radius: 50%;
background: linear-gradient(45deg, #ff6b35, #3182ce);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
font-size: 1.2rem;
}
.author-details h4 {
color: #2d3748;
margin-bottom: 0.2rem;
}
.author-details p {
color: #666;
font-size: 0.9rem;
}
.featured-image {
height: 400px;
background: linear-gradient(45deg, #ff6b35, #f093fb);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 4rem;
margin-bottom: 2rem;
}
.article-content {
padding: 0 2rem 2rem;
}
.article-content h2 {
font-size: 1.6rem;
color: #2d3748;
margin: 2rem 0 1rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #ff6b35;
}
.article-content h3 {
font-size: 1.3rem;
color: #2d3748;
margin: 1.5rem 0 0.8rem;
}
.article-content p {
margin-bottom: 1.5rem;
line-height: 1.8;
color: #4a5568;
}
.article-content ul, .article-content ol {
margin: 1rem 0 1.5rem 2rem;
color: #4a5568;
}
.article-content li {
margin-bottom: 0.5rem;
line-height: 1.7;
}
.callout-box {
background: linear-gradient(135deg, #e6fffa 0%, #f0fff4 100%);
border-left: 4px solid #38a169;
padding: 1.5rem;
margin: 2rem 0;
border-radius: 0 8px 8px 0;
}
.callout-box h4 {
color: #2f855a;
margin-bottom: 0.8rem;
font-size: 1.1rem;
}
.quote-box {
background: #f7fafc;
border-left: 4px solid #3182ce;
padding: 1.5rem;
margin: 2rem 0;
font-style: italic;
font-size: 1.1rem;
color: #2d3748;
}
/* Tags */
.article-tags {
padding: 0 2rem 2rem;
border-top: 1px solid #e2e8f0;
margin-top: 2rem;
padding-top: 2rem;
}
.tags-label {
font-weight: 600;
color: #2d3748;
margin-bottom: 1rem;
display: block;
}
.tags-list {
display: flex;
flex-wrap: wrap;
gap: 0.8rem;
}
.tag {
background: #e2e8f0;
color: #4a5568;
padding: 0.4rem 1rem;
border-radius: 20px;
text-decoration: none;
font-size: 0.9rem;
transition: all 0.3s;
}
.tag:hover {
background: #3182ce;
color: white;
}
/* Social Share */
.social-share {
background: white;
padding: 1.5rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
margin-bottom: 2rem;
}
.share-title {
font-weight: 600;
color: #2d3748;
margin-bottom: 1rem;
}
.share-buttons {
display: flex;
gap: 1rem;
}
.share-btn {
padding: 0.8rem 1.2rem;
border-radius: 8px;
text-decoration: none;
color: white;
font-weight: 500;
transition: transform 0.3s;
display: flex;
align-items: center;
gap: 0.5rem;
}
.share-btn:hover {
transform: translateY(-2px);
}
.share-twitter { background: #1da1f2; }
.share-linkedin { background: #0077b5; }
.share-facebook { background: #1877f2; }
/* Sidebar */
.sidebar {
display: flex;
flex-direction: column;
gap: 2rem;
}
.sidebar-widget {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
}
.widget-title {
font-size: 1.3rem;
margin-bottom: 1.5rem;
color: #2d3748;
border-bottom: 2px solid #ff6b35;
padding-bottom: 0.5rem;
}
.author-bio {
text-align: center;
}
.author-bio-avatar {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(45deg, #ff6b35, #3182ce);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
font-size: 2rem;
margin: 0 auto 1rem;
}
.author-bio h4 {
color: #2d3748;
margin-bottom: 0.5rem;
}
.author-bio p {
color: #666;
line-height: 1.6;
margin-bottom: 1rem;
}
.related-posts {
list-style: none;
}
.related-post-item {
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.related-post-item:last-child {
border-bottom: none;
}
.related-post-title {
font-weight: 600;
color: #2d3748;
text-decoration: none;
transition: color 0.3s;
display: block;
margin-bottom: 0.3rem;
line-height: 1.4;
}
.related-post-title:hover {
color: #3182ce;
}
.related-post-date {
font-size: 0.8rem;
color: #888;
}
/* Newsletter Signup */
.newsletter-form {
display: flex;
flex-direction: column;
gap: 1rem;
}
.newsletter-input {
padding: 1rem;
border: 2px solid #e2e8f0;
border-radius: 8px;
font-size: 1rem;
transition: border-color 0.3s;
}
.newsletter-input:focus {
outline: none;
border-color: #3182ce;
}
.newsletter-btn {
background: #ff6b35;
color: white;
border: none;
padding: 1rem;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.3s;
}
.newsletter-btn:hover {
background: #e55a2b;
}
/* Navigation */
.post-navigation {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
margin-top: 2rem;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
}
.nav-post {
text-decoration: none;
color: #4a5568;
transition: color 0.3s;
}
.nav-post:hover {
color: #3182ce;
}
.nav-post.prev {
text-align: left;
}
.nav-post.next {
text-align: right;
}
.nav-label {
font-size: 0.9rem;
color: #888;
margin-bottom: 0.5rem;
display: block;
}
.nav-title {
font-weight: 600;
line-height: 1.4;
}
/* Footer */
.footer {
background: #2d3748;
color: white;
text-align: center;
padding: 2rem 0;
margin-top: 4rem;
}
/* Responsive */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
text-align: center;
}
.nav-links {
flex-wrap: wrap;
justify-content: center;
}
.content-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.article-title {
font-size: 1.8rem;
}
.article-meta {
flex-direction: column;
gap: 1rem;
align-items: flex-start;
}
.author-info {
flex-direction: row;
}
.share-buttons {
flex-direction: column;
}
.post-navigation {
grid-template-columns: 1fr;
gap: 1rem;
}
.nav-post.next {
text-align: left;
}
}

View File

View File

@@ -0,0 +1,373 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8f9fa;
}
/* Header */
.header {
background: linear-gradient(135deg, #2c5282 0%, #3182ce 100%);
color: white;
padding: 1rem 0;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
color: #ff6b35;
}
.nav-links {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-links a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.nav-links a:hover {
color: #ff6b35;
}
.blog-header {
text-align: center;
padding: 2rem 0;
}
.blog-header h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
}
.blog-header p {
font-size: 1.2rem;
opacity: 0.9;
max-width: 600px;
margin: 0 auto;
}
/* Main Content */
.main-content {
padding: 3rem 0;
}
.blog-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 3rem;
margin-bottom: 3rem;
}
/* Featured Post */
.featured-post {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
transition: transform 0.3s, box-shadow 0.3s;
}
.featured-post:hover {
transform: translateY(-5px);
box-shadow: 0 8px 30px rgba(0,0,0,0.15);
}
.featured-image {
height: 300px;
background: linear-gradient(45deg, #ff6b35, #f093fb);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 3rem;
}
.featured-content {
padding: 2rem;
}
.post-category {
display: inline-block;
background: #ff6b35;
color: white;
padding: 0.3rem 1rem;
border-radius: 20px;
font-size: 0.8rem;
font-weight: 600;
margin-bottom: 1rem;
}
.featured-content h2 {
font-size: 1.8rem;
margin-bottom: 1rem;
color: #2d3748;
line-height: 1.3;
}
.post-excerpt {
color: #666;
margin-bottom: 1.5rem;
line-height: 1.7;
}
.post-meta {
display: flex;
align-items: center;
gap: 1rem;
font-size: 0.9rem;
color: #888;
margin-bottom: 1rem;
}
.read-more {
display: inline-flex;
align-items: center;
color: #3182ce;
text-decoration: none;
font-weight: 600;
transition: color 0.3s;
}
.read-more:hover {
color: #2c5282;
}
.read-more::after {
content: ' →';
margin-left: 0.5rem;
transition: margin-left 0.3s;
}
.read-more:hover::after {
margin-left: 1rem;
}
/* Sidebar */
.sidebar {
display: flex;
flex-direction: column;
gap: 2rem;
}
.sidebar-widget {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
}
.widget-title {
font-size: 1.3rem;
margin-bottom: 1.5rem;
color: #2d3748;
border-bottom: 2px solid #ff6b35;
padding-bottom: 0.5rem;
}
.category-list {
list-style: none;
}
.category-list li {
padding: 0.8rem 0;
border-bottom: 1px solid #e2e8f0;
display: flex;
justify-content: space-between;
}
.category-list li:last-child {
border-bottom: none;
}
.category-list a {
color: #4a5568;
text-decoration: none;
transition: color 0.3s;
}
.category-list a:hover {
color: #3182ce;
}
.post-count {
background: #e2e8f0;
color: #4a5568;
padding: 0.2rem 0.6rem;
border-radius: 12px;
font-size: 0.8rem;
}
.recent-posts {
list-style: none;
}
.recent-post-item {
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.recent-post-item:last-child {
border-bottom: none;
}
.recent-post-title {
font-weight: 600;
color: #2d3748;
text-decoration: none;
transition: color 0.3s;
display: block;
margin-bottom: 0.3rem;
}
.recent-post-title:hover {
color: #3182ce;
}
.recent-post-date {
font-size: 0.8rem;
color: #888;
}
/* Blog Posts Grid */
.blog-posts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
margin-top: 2rem;
}
.blog-post-card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
transition: transform 0.3s, box-shadow 0.3s;
}
.blog-post-card:hover {
transform: translateY(-3px);
box-shadow: 0 6px 25px rgba(0,0,0,0.12);
}
.post-image {
height: 200px;
background: linear-gradient(45deg, #667eea, #764ba2);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 2rem;
}
.post-content {
padding: 1.5rem;
}
.post-content h3 {
font-size: 1.3rem;
margin-bottom: 1rem;
color: #2d3748;
line-height: 1.3;
}
/* Newsletter Signup */
.newsletter-form {
display: flex;
flex-direction: column;
gap: 1rem;
}
.newsletter-input {
padding: 1rem;
border: 2px solid #e2e8f0;
border-radius: 8px;
font-size: 1rem;
transition: border-color 0.3s;
}
.newsletter-input:focus {
outline: none;
border-color: #3182ce;
}
.newsletter-btn {
background: #ff6b35;
color: white;
border: none;
padding: 1rem;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.3s;
}
.newsletter-btn:hover {
background: #e55a2b;
}
/* Footer */
.footer {
background: #2d3748;
color: white;
text-align: center;
padding: 2rem 0;
margin-top: 4rem;
}
/* Responsive */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
text-align: center;
}
.nav-links {
flex-wrap: wrap;
justify-content: center;
}
.blog-header h1 {
font-size: 2rem;
}
.blog-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.blog-posts-grid {
grid-template-columns: 1fr;
}
.featured-content h2 {
font-size: 1.5rem;
}
}

805
static/dist/css/blog_home.bundle.css vendored Normal file
View File

@@ -0,0 +1,805 @@
/* Home page
*/
/* Footer */
.footer {
background: #1f2937;
color: #f3f4f6;
padding: 4rem 2rem 2rem;
}
.footer-content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
margin-bottom: 2rem;
}
.footer-section h3 {
color: #fff;
margin-bottom: 1rem;
font-size: 1.2rem;
text-align: center;
}
.footer-section ul {
list-style: none;
padding: 0;
}
.footer-section ul li {
margin-bottom: 0.5rem;
}
.footer-section a {
color: #f3f4f6;
text-decoration: none;
transition: color 0.3s ease;
}
.footer-section a:hover {
color: #fff;
text-decoration: underline;
}
.footer-bottom {
border-top: 1px solid #374151;
padding-top: 2rem;
text-align: center;
font-size: 0.9rem;
}
.footer-bottom a {
color: aquamarine;
}
.footer-section.contact {
width: 100%;
}
.footer-section .container {
padding: 0;
}
.footer-section .container.row .container.column {
padding: 1vh 2vw;
}
@media (max-width: 768px) {
.footer-content {
grid-template-columns: 1fr;
text-align: center;
}
}
@media (max-width: 540px) {
.nav-links {
display: none;
}
}
/* Common */
section {
padding: 2rem;
}
p {
width: 100%;
font-size: 16px;
}
p.section-title,
p.section-subtitle {
margin: 0 auto;
}
.section-subtitle {
font-size: 18px;
}
ul li {
font-size: 16px;
}
section.benefits .card.benefits,
section.social-proof .card.social-proof {
display: flex;
}
section.problem,
section.benefits,
section.solution,
section.testimonial {
padding: 4rem 2rem;
background: var(--colour-page-background-1);
}
section.problem .card.problem,
section.benefits .card.benefits,
section.solution .card.solution,
section.testimonial .card.testimonial {
background: var(--colour-text-background);
border-radius: 8px;
max-width: 800px;
margin: 3rem auto 0;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
/* Hero Section */
.hero {
padding: 8rem 2rem 4rem;
background: linear-gradient(45deg, var(--colour-page-background-1), var(--colour-page-background-2)); /* linear-gradient(45deg, #f8fafc, #eff6ff); */
}
.hero-content {
max-width: 600px;
}
.hero h1 {
line-height: 1.2;
margin-bottom: 1.5rem;
color: var(--colour-text);
}
.hero p {
font-size: 1.25rem;
margin-bottom: 2rem;
color: var(--colour-secondary);
}
section.hero .button {
margin: 0 auto;
margin-bottom: 2vh;
display: block;
background-color: var(--colour-success-title);
color: var(--colour-text-background);
}
section.hero .button:hover {
background-color: var(--colour-success-highlight);
color: var(--colour-success-title);
}
/* Problem Section */
section.problem {
background-color: var(--colour-error-highlight);
}
section.problem h2 {
color: var(--colour-error-title);
}
section.problem .card {
border-left: 4px solid var(--colour-error-accent);
}
section.problem ul li {
list-style: none;
}
/*
section.problem .problem.card:hover {
transform: translateY(-5px);
}
*/
section.problem .section-subtitle {
/* font-size: 18px; */
font-weight: bold;
}
/*
section.problem ul li::before {
content: "😤";
position: absolute;
left: 0;
}
*/
/* Benefits Section * /
section.benefits .section-subtitle {
font-size: 18px;
font-weight: bold;
}
*/
section.benefits {
background-color: var(--colour-success-highlight);
}
section.benefits .container .card .container {
min-width: 250px;
}
section.benefits h2 {
color: var(--colour-success);
}
section.benefits .card {
border-left: 4px solid var(--colour-success);
}
/* Solution Section */
section.solution .container .card {
margin-top: 1vh;
max-width: min(2000px, 80vw);
}
section.benefits .card.benefits .container,
section.solution .container .card .container {
padding: 1vh 2vw;
max-width: min(500px, 80vw);
}
section.solution .container .card .container p {
margin-bottom: 1vh;
}
section.solution .project-thumbnail img {
max-width: min(500px, 80vw);
max-height: min(500px, 80vw);
border-radius: 1vh;
}
section.solution .project-thumbnail img {
overflow: hidden;
transition: transform 0.3s ease;
}
section.solution .project-thumbnail:hover {
transform: scale(1.75);
}
/* Social Proof Section * /
section.social-proof {
padding: 6rem 0;
background: white;
}
section.social-proof .card.social-proof {
background: var(--colour-page-background);
padding: 2rem;
border-radius: 8px;
text-align: center;
max-width: 400px;
margin: 3rem auto 0;
}
section.social-proof ul {
list-style: none;
margin: 0;
}
* /
section.social-proof .section-subtitle {
font-size: 16px;
}
section.social-proof ul li {
font-size: 14px;
}
*/
section.social-proof {
padding: 4rem 0;
background: var(--colour-text-background);
}
section.social-proof .card.social-proof {
background: var(--colour-page-background);
border-radius: 8px;
transition: transform 0.3s ease;
padding: 1.5vh;
}
section.social-proof .section-title {
font-weight: bold;
color: var(--colour-text-link-visited);
margin-bottom: 0.25vh;
}
section.social-proof .section-subtitle {
margin: 0 1vw 1vh;
}
section.social-proof .container {
width: fit-content;
margin: 0 2vw;
min-width: 175px;
}
section.social-proof > .container {
max-width: min(900px, 90vw);
margin: 1vh auto;
}
/* Early Access Section * /
section.early-access {
padding: 6rem 0;
background: white;
}
section.early-access .card.early-access {
background: var(--colour-page-background);
padding: 2rem;
border-radius: 8px;
text-align: center;
max-width: 400px;
margin: 3rem auto 0;
}
section.early-access ul {
list-style: none;
margin: 0;
}
section.early-access a.button {
margin: 0.25rem;
}
*/
/* Features section * /
section.features .button {
margin-top: 0;
}
*/
/* Testimonials section */
section.testimonial p {
margin-bottom: 1vh;
}
section.testimonial h2 {
margin: 0 auto;
}
/* CTA Section */
.cta-1,
.cta-2 {
padding: 6rem 2rem;
background: linear-gradient(135deg, var(--colour-primary), var(--colour-text-link-visited));
color: white;
text-align: center;
}
section.cta-2 .button {
margin: 2vh 1vw;
}
section.cta-2 .card {
background-color: transparent;
margin: 1vh auto;
}
section.cta-2 .card .container {
background-color: var(--colour-page-background);
color: var(--colour-primary);
border-radius: 1vh;
padding: 1.5vh 3vw;
margin: 1vh;
min-width: 200px;
min-height: 120px;
}
section.cta-2 .card .container h3 {
margin: 0 auto;
}
section.cta-2 .container p {
margin-top: 1vh;
}
/* FAQs * /
section.faq .button {
margin-bottom: 0.25rem;
}
*/
/* Animations */
/* Fallback styles to ensure content is visible without JS */
.reveal {
opacity: 1; /* Default visible state */
}
/* Only hide elements if browser supports Intersection Observer */
@supports (animation-name: fade) {
.reveal {
opacity: 0;
}
.reveal.active {
animation: fade-up 0.8s ease-out forwards;
}
}
@keyframes fade-up {
0% {
opacity: 0;
transform: translateY(30px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.delay-1 { animation-delay: 0.1s; }
.delay-2 { animation-delay: 0.2s; }
.delay-3 { animation-delay: 0.3s; }
.delay-4 { animation-delay: 0.4s; }
/* Buttons */
.topnav .nav-links .button {
padding: 0.5vh 0.75vh;
}
.button {
padding: 0.75rem 1.5rem;
/* border-radius: 6px; * /
margin: 0.75rem; */
font-size: 1.2rem;
}
.button-primary {
background: var(--colour-primary);
color: white;
}
.button-primary:hover {
background: var(--colour-secondary);
}
.button-light {
background: white;
color: var(--colour-primary);
}
.button-light:hover {
background: var(--colour-page-background);
}
.logo:hover{
cursor: pointer;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8f9fa;
}
/* Header */
.header {
background: linear-gradient(135deg, #2c5282 0%, #3182ce 100%);
color: white;
padding: 1rem 0;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
color: #ff6b35;
}
.nav-links {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-links a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.nav-links a:hover {
color: #ff6b35;
}
.blog-header {
text-align: center;
padding: 2rem 0;
}
.blog-header h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
}
.blog-header p {
font-size: 1.2rem;
opacity: 0.9;
max-width: 600px;
margin: 0 auto;
}
/* Main Content */
.main-content {
padding: 3rem 0;
}
.blog-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 3rem;
margin-bottom: 3rem;
}
/* Featured Post */
.featured-post {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
transition: transform 0.3s, box-shadow 0.3s;
}
.featured-post:hover {
transform: translateY(-5px);
box-shadow: 0 8px 30px rgba(0,0,0,0.15);
}
.featured-image {
height: 300px;
background: linear-gradient(45deg, #ff6b35, #f093fb);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 3rem;
}
.featured-content {
padding: 2rem;
}
.post-category {
display: inline-block;
background: #ff6b35;
color: white;
padding: 0.3rem 1rem;
border-radius: 20px;
font-size: 0.8rem;
font-weight: 600;
margin-bottom: 1rem;
}
.featured-content h2 {
font-size: 1.8rem;
margin-bottom: 1rem;
color: #2d3748;
line-height: 1.3;
}
.post-excerpt {
color: #666;
margin-bottom: 1.5rem;
line-height: 1.7;
}
.post-meta {
display: flex;
align-items: center;
gap: 1rem;
font-size: 0.9rem;
color: #888;
margin-bottom: 1rem;
}
.read-more {
display: inline-flex;
align-items: center;
color: #3182ce;
text-decoration: none;
font-weight: 600;
transition: color 0.3s;
}
.read-more:hover {
color: #2c5282;
}
.read-more::after {
content: ' →';
margin-left: 0.5rem;
transition: margin-left 0.3s;
}
.read-more:hover::after {
margin-left: 1rem;
}
/* Sidebar */
.sidebar {
display: flex;
flex-direction: column;
gap: 2rem;
}
.sidebar-widget {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
}
.widget-title {
font-size: 1.3rem;
margin-bottom: 1.5rem;
color: #2d3748;
border-bottom: 2px solid #ff6b35;
padding-bottom: 0.5rem;
}
.category-list {
list-style: none;
}
.category-list li {
padding: 0.8rem 0;
border-bottom: 1px solid #e2e8f0;
display: flex;
justify-content: space-between;
}
.category-list li:last-child {
border-bottom: none;
}
.category-list a {
color: #4a5568;
text-decoration: none;
transition: color 0.3s;
}
.category-list a:hover {
color: #3182ce;
}
.post-count {
background: #e2e8f0;
color: #4a5568;
padding: 0.2rem 0.6rem;
border-radius: 12px;
font-size: 0.8rem;
}
.recent-posts {
list-style: none;
}
.recent-post-item {
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.recent-post-item:last-child {
border-bottom: none;
}
.recent-post-title {
font-weight: 600;
color: #2d3748;
text-decoration: none;
transition: color 0.3s;
display: block;
margin-bottom: 0.3rem;
}
.recent-post-title:hover {
color: #3182ce;
}
.recent-post-date {
font-size: 0.8rem;
color: #888;
}
/* Blog Posts Grid */
.blog-posts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
margin-top: 2rem;
}
.blog-post-card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
transition: transform 0.3s, box-shadow 0.3s;
}
.blog-post-card:hover {
transform: translateY(-3px);
box-shadow: 0 6px 25px rgba(0,0,0,0.12);
}
.post-image {
height: 200px;
background: linear-gradient(45deg, #667eea, #764ba2);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 2rem;
}
.post-content {
padding: 1.5rem;
}
.post-content h3 {
font-size: 1.3rem;
margin-bottom: 1rem;
color: #2d3748;
line-height: 1.3;
}
/* Newsletter Signup */
.newsletter-form {
display: flex;
flex-direction: column;
gap: 1rem;
}
.newsletter-input {
padding: 1rem;
border: 2px solid #e2e8f0;
border-radius: 8px;
font-size: 1rem;
transition: border-color 0.3s;
}
.newsletter-input:focus {
outline: none;
border-color: #3182ce;
}
.newsletter-btn {
background: #ff6b35;
color: white;
border: none;
padding: 1rem;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.3s;
}
.newsletter-btn:hover {
background: #e55a2b;
}
/* Footer */
.footer {
background: #2d3748;
color: white;
text-align: center;
padding: 2rem 0;
margin-top: 4rem;
}
/* Responsive */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
text-align: center;
}
.nav-links {
flex-wrap: wrap;
justify-content: center;
}
.blog-header h1 {
font-size: 2rem;
}
.blog-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.blog-posts-grid {
grid-template-columns: 1fr;
}
.featured-content h2 {
font-size: 1.5rem;
}
}
/*# sourceMappingURL=blog_home.bundle.css.map*/

File diff suppressed because one or more lines are too long

29
static/dist/js/blog_home.bundle.js vendored Normal file
View File

@@ -0,0 +1,29 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
/******/ })()
;
//# sourceMappingURL=blog_home.bundle.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"js/blog_home.bundle.js","mappings":";;;;AAAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/core.css?6d04","webpack://app/./static/css/pages/core/home.css?2b63","webpack://app/./static/css/sections/blog.css?b688","webpack://app/./static/css/pages/blog/home.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}

View File

@@ -4975,13 +4975,13 @@ var PageApplyFoundingPartnerSuccess = /*#__PURE__*/function (_BasePage) {
}(BasePage);
apply_founding_partner_success_defineProperty(PageApplyFoundingPartnerSuccess, "hash", hashPageApplyFoundingPartnerSuccess);
;// ./static/js/pages/dog/home.js
function dog_home_typeof(o) { "@babel/helpers - typeof"; return dog_home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, dog_home_typeof(o); }
function dog_home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function dog_home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, dog_home_toPropertyKey(o.key), o); } }
function dog_home_createClass(e, r, t) { return r && dog_home_defineProperties(e.prototype, r), t && dog_home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
;// ./static/js/pages/blog/home.js
function blog_home_typeof(o) { "@babel/helpers - typeof"; return blog_home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, blog_home_typeof(o); }
function blog_home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function blog_home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, blog_home_toPropertyKey(o.key), o); } }
function blog_home_createClass(e, r, t) { return r && blog_home_defineProperties(e.prototype, r), t && blog_home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function home_callSuper(t, o, e) { return o = home_getPrototypeOf(o), home_possibleConstructorReturn(t, home_isNativeReflectConstruct() ? Reflect.construct(o, e || [], home_getPrototypeOf(t).constructor) : o.apply(t, e)); }
function home_possibleConstructorReturn(t, e) { if (e && ("object" == dog_home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return home_assertThisInitialized(t); }
function home_possibleConstructorReturn(t, e) { if (e && ("object" == blog_home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return home_assertThisInitialized(t); }
function home_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function home_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (home_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function home_superPropGet(t, o, e, r) { var p = home_get(home_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
@@ -4990,6 +4990,48 @@ function home_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null
function home_getPrototypeOf(t) { return home_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, home_getPrototypeOf(t); }
function home_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && home_setPrototypeOf(t, e); }
function home_setPrototypeOf(t, e) { return home_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, home_setPrototypeOf(t, e); }
function blog_home_defineProperty(e, r, t) { return (r = blog_home_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function blog_home_toPropertyKey(t) { var i = blog_home_toPrimitive(t, "string"); return "symbol" == blog_home_typeof(i) ? i : i + ""; }
function blog_home_toPrimitive(t, r) { if ("object" != blog_home_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != blog_home_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
// internal
// external
var PageBlogHome = /*#__PURE__*/function (_BasePage) {
function PageBlogHome(router) {
blog_home_classCallCheck(this, PageBlogHome);
return home_callSuper(this, PageBlogHome, [router]);
}
home_inherits(PageBlogHome, _BasePage);
return blog_home_createClass(PageBlogHome, [{
key: "initialize",
value: function initialize() {
this.sharedInitialize();
// this.hookupButtonsNav();
}
}, {
key: "leave",
value: function leave() {
home_superPropGet(PageBlogHome, "leave", this, 3)([]);
}
}]);
}(BasePage);
blog_home_defineProperty(PageBlogHome, "hash", hashPageBlogHome);
;// ./static/js/pages/dog/home.js
function dog_home_typeof(o) { "@babel/helpers - typeof"; return dog_home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, dog_home_typeof(o); }
function dog_home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function dog_home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, dog_home_toPropertyKey(o.key), o); } }
function dog_home_createClass(e, r, t) { return r && dog_home_defineProperties(e.prototype, r), t && dog_home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function dog_home_callSuper(t, o, e) { return o = dog_home_getPrototypeOf(o), dog_home_possibleConstructorReturn(t, dog_home_isNativeReflectConstruct() ? Reflect.construct(o, e || [], dog_home_getPrototypeOf(t).constructor) : o.apply(t, e)); }
function dog_home_possibleConstructorReturn(t, e) { if (e && ("object" == dog_home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return dog_home_assertThisInitialized(t); }
function dog_home_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function dog_home_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (dog_home_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function dog_home_superPropGet(t, o, e, r) { var p = dog_home_get(dog_home_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
function dog_home_get() { return dog_home_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = dog_home_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, dog_home_get.apply(null, arguments); }
function dog_home_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = dog_home_getPrototypeOf(t));); return t; }
function dog_home_getPrototypeOf(t) { return dog_home_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, dog_home_getPrototypeOf(t); }
function dog_home_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && dog_home_setPrototypeOf(t, e); }
function dog_home_setPrototypeOf(t, e) { return dog_home_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, dog_home_setPrototypeOf(t, e); }
function dog_home_defineProperty(e, r, t) { return (r = dog_home_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function dog_home_toPropertyKey(t) { var i = dog_home_toPrimitive(t, "string"); return "symbol" == dog_home_typeof(i) ? i : i + ""; }
function dog_home_toPrimitive(t, r) { if ("object" != dog_home_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != dog_home_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
@@ -4997,9 +5039,9 @@ function dog_home_toPrimitive(t, r) { if ("object" != dog_home_typeof(t) || !t)
var PageDogHome = /*#__PURE__*/function (_BasePage) {
function PageDogHome(router) {
dog_home_classCallCheck(this, PageDogHome);
return home_callSuper(this, PageDogHome, [router]);
return dog_home_callSuper(this, PageDogHome, [router]);
}
home_inherits(PageDogHome, _BasePage);
dog_home_inherits(PageDogHome, _BasePage);
return dog_home_createClass(PageDogHome, [{
key: "initialize",
value: function initialize() {
@@ -5012,7 +5054,7 @@ var PageDogHome = /*#__PURE__*/function (_BasePage) {
}, {
key: "leave",
value: function leave() {
home_superPropGet(PageDogHome, "leave", this, 3)([]);
dog_home_superPropGet(PageDogHome, "leave", this, 3)([]);
}
}]);
}(BasePage);
@@ -8758,6 +8800,8 @@ function router_toPrimitive(t, r) { if ("object" != router_typeof(t) || !t) retu
// Blog
// Dog
@@ -8812,6 +8856,11 @@ var Router = /*#__PURE__*/function () {
name: 'PageApplyFoundingPartnerSuccess',
module: PageApplyFoundingPartnerSuccess
};
// Blog
this.pages[hashPageBlogHome] = {
name: 'PageBlogHome',
module: PageBlogHome
};
// Dog
this.pages[hashPageDogHome] = {
name: 'PageDogHome',
@@ -8912,6 +8961,11 @@ var Router = /*#__PURE__*/function () {
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
return _this.navigateToHash(hashPageApplyFoundingPartnerSuccess, isPopState);
};
// Blog
this.routes[hashPageBlogHome] = function () {
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
return _this.navigateToHash(hashPageBlogHome, isPopState);
};
// Dog
this.routes[hashPageDogHome] = function () {
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,829 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>How to Scale Your Dog Training Business from 25 to 100+ Clients - Fetch Metrics</title>
<meta name="description" content="Discover proven strategies successful trainers use to systematically grow their client base while maintaining quality training standards.">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8f9fa;
}
/* Header */
.header {
background: linear-gradient(135deg, #2c5282 0%, #3182ce 100%);
color: white;
padding: 1rem 0;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
color: #ff6b35;
}
.nav-links {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-links a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.nav-links a:hover {
color: #ff6b35;
}
/* Breadcrumb */
.breadcrumb {
background: white;
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.breadcrumb-nav {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9rem;
color: #666;
}
.breadcrumb-nav a {
color: #3182ce;
text-decoration: none;
}
.breadcrumb-nav a:hover {
text-decoration: underline;
}
/* Main Content */
.main-content {
padding: 3rem 0;
}
.content-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 3rem;
}
/* Article */
.article {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.article-header {
padding: 2rem 2rem 1rem;
}
.article-category {
display: inline-block;
background: #ff6b35;
color: white;
padding: 0.4rem 1.2rem;
border-radius: 25px;
font-size: 0.9rem;
font-weight: 600;
margin-bottom: 1.5rem;
}
.article-title {
font-size: 2.2rem;
color: #2d3748;
line-height: 1.3;
margin-bottom: 1.5rem;
}
.article-meta {
display: flex;
align-items: center;
gap: 2rem;
padding-bottom: 1.5rem;
border-bottom: 2px solid #e2e8f0;
margin-bottom: 2rem;
}
.meta-item {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.95rem;
color: #666;
}
.author-info {
display: flex;
align-items: center;
gap: 1rem;
}
.author-avatar {
width: 50px;
height: 50px;
border-radius: 50%;
background: linear-gradient(45deg, #ff6b35, #3182ce);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
font-size: 1.2rem;
}
.author-details h4 {
color: #2d3748;
margin-bottom: 0.2rem;
}
.author-details p {
color: #666;
font-size: 0.9rem;
}
.featured-image {
height: 400px;
background: linear-gradient(45deg, #ff6b35, #f093fb);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 4rem;
margin-bottom: 2rem;
}
.article-content {
padding: 0 2rem 2rem;
}
.article-content h2 {
font-size: 1.6rem;
color: #2d3748;
margin: 2rem 0 1rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #ff6b35;
}
.article-content h3 {
font-size: 1.3rem;
color: #2d3748;
margin: 1.5rem 0 0.8rem;
}
.article-content p {
margin-bottom: 1.5rem;
line-height: 1.8;
color: #4a5568;
}
.article-content ul, .article-content ol {
margin: 1rem 0 1.5rem 2rem;
color: #4a5568;
}
.article-content li {
margin-bottom: 0.5rem;
line-height: 1.7;
}
.callout-box {
background: linear-gradient(135deg, #e6fffa 0%, #f0fff4 100%);
border-left: 4px solid #38a169;
padding: 1.5rem;
margin: 2rem 0;
border-radius: 0 8px 8px 0;
}
.callout-box h4 {
color: #2f855a;
margin-bottom: 0.8rem;
font-size: 1.1rem;
}
.quote-box {
background: #f7fafc;
border-left: 4px solid #3182ce;
padding: 1.5rem;
margin: 2rem 0;
font-style: italic;
font-size: 1.1rem;
color: #2d3748;
}
/* Tags */
.article-tags {
padding: 0 2rem 2rem;
border-top: 1px solid #e2e8f0;
margin-top: 2rem;
padding-top: 2rem;
}
.tags-label {
font-weight: 600;
color: #2d3748;
margin-bottom: 1rem;
display: block;
}
.tags-list {
display: flex;
flex-wrap: wrap;
gap: 0.8rem;
}
.tag {
background: #e2e8f0;
color: #4a5568;
padding: 0.4rem 1rem;
border-radius: 20px;
text-decoration: none;
font-size: 0.9rem;
transition: all 0.3s;
}
.tag:hover {
background: #3182ce;
color: white;
}
/* Social Share */
.social-share {
background: white;
padding: 1.5rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
margin-bottom: 2rem;
}
.share-title {
font-weight: 600;
color: #2d3748;
margin-bottom: 1rem;
}
.share-buttons {
display: flex;
gap: 1rem;
}
.share-btn {
padding: 0.8rem 1.2rem;
border-radius: 8px;
text-decoration: none;
color: white;
font-weight: 500;
transition: transform 0.3s;
display: flex;
align-items: center;
gap: 0.5rem;
}
.share-btn:hover {
transform: translateY(-2px);
}
.share-twitter { background: #1da1f2; }
.share-linkedin { background: #0077b5; }
.share-facebook { background: #1877f2; }
/* Sidebar */
.sidebar {
display: flex;
flex-direction: column;
gap: 2rem;
}
.sidebar-widget {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
}
.widget-title {
font-size: 1.3rem;
margin-bottom: 1.5rem;
color: #2d3748;
border-bottom: 2px solid #ff6b35;
padding-bottom: 0.5rem;
}
.author-bio {
text-align: center;
}
.author-bio-avatar {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(45deg, #ff6b35, #3182ce);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
font-size: 2rem;
margin: 0 auto 1rem;
}
.author-bio h4 {
color: #2d3748;
margin-bottom: 0.5rem;
}
.author-bio p {
color: #666;
line-height: 1.6;
margin-bottom: 1rem;
}
.related-posts {
list-style: none;
}
.related-post-item {
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.related-post-item:last-child {
border-bottom: none;
}
.related-post-title {
font-weight: 600;
color: #2d3748;
text-decoration: none;
transition: color 0.3s;
display: block;
margin-bottom: 0.3rem;
line-height: 1.4;
}
.related-post-title:hover {
color: #3182ce;
}
.related-post-date {
font-size: 0.8rem;
color: #888;
}
/* Newsletter Signup */
.newsletter-form {
display: flex;
flex-direction: column;
gap: 1rem;
}
.newsletter-input {
padding: 1rem;
border: 2px solid #e2e8f0;
border-radius: 8px;
font-size: 1rem;
transition: border-color 0.3s;
}
.newsletter-input:focus {
outline: none;
border-color: #3182ce;
}
.newsletter-btn {
background: #ff6b35;
color: white;
border: none;
padding: 1rem;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.3s;
}
.newsletter-btn:hover {
background: #e55a2b;
}
/* Navigation */
.post-navigation {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
margin-top: 2rem;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
}
.nav-post {
text-decoration: none;
color: #4a5568;
transition: color 0.3s;
}
.nav-post:hover {
color: #3182ce;
}
.nav-post.prev {
text-align: left;
}
.nav-post.next {
text-align: right;
}
.nav-label {
font-size: 0.9rem;
color: #888;
margin-bottom: 0.5rem;
display: block;
}
.nav-title {
font-weight: 600;
line-height: 1.4;
}
/* Footer */
.footer {
background: #2d3748;
color: white;
text-align: center;
padding: 2rem 0;
margin-top: 4rem;
}
/* Responsive */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
text-align: center;
}
.nav-links {
flex-wrap: wrap;
justify-content: center;
}
.content-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.article-title {
font-size: 1.8rem;
}
.article-meta {
flex-direction: column;
gap: 1rem;
align-items: flex-start;
}
.author-info {
flex-direction: row;
}
.share-buttons {
flex-direction: column;
}
.post-navigation {
grid-template-columns: 1fr;
gap: 1rem;
}
.nav-post.next {
text-align: left;
}
}
</style>
</head>
<body>
<!-- Header -->
<header class="header">
<div class="container">
<nav class="nav">
<div class="logo">🐕 Fetch Metrics</div>
<ul class="nav-links">
<li><a href="#home">Home</a></li>
<li><a href="#features">Features</a></li>
<li><a href="#pricing">Pricing</a></li>
<li><a href="#blog">Blog</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</div>
</header>
<!-- Breadcrumb -->
<nav class="breadcrumb">
<div class="container">
<div class="breadcrumb-nav">
<a href="#home">Home</a>
<span>></span>
<a href="#blog">Blog</a>
<span>></span>
<span>How to Scale Your Dog Training Business</span>
</div>
</div>
</nav>
<!-- Main Content -->
<main class="main-content">
<div class="container">
<div class="content-grid">
<!-- Article -->
<article class="article">
<header class="article-header">
<span class="article-category">Business Growth</span>
<h1 class="article-title">How to Scale Your Dog Training Business from 25 to 100+ Clients</h1>
<div class="article-meta">
<div class="author-info">
<div class="author-avatar">SM</div>
<div class="author-details">
<h4>Sarah Mitchell</h4>
<p>Professional Dog Trainer & Business Coach</p>
</div>
</div>
<div class="meta-item">
<span>📅</span>
<span>March 15, 2025</span>
</div>
<div class="meta-item">
<span>⏱️</span>
<span>8 min read</span>
</div>
<div class="meta-item">
<span>👀</span>
<span>1,247 views</span>
</div>
</div>
</header>
<div class="featured-image">🎯</div>
<div class="article-content">
<p>Growing a dog training business from 25 to 100+ clients isn't just about finding more customers—it's about building systems that can handle increased demand while maintaining the quality that made you successful in the first place.</p>
<p>After working with over 200 professional trainers across the UK, I've identified the key strategies that separate trainers who successfully scale from those who plateau at 20-30 clients. Let's dive into the proven framework that works.</p>
<h2>The Scaling Mindset Shift</h2>
<p>The biggest obstacle to scaling isn't finding more clients—it's the mental shift from "doing everything yourself" to "building systems that work without you." Many trainers fear that delegating or systematizing will compromise their training quality, but the opposite is true.</p>
<div class="callout-box">
<h4>💡 Key Insight</h4>
<p>Successful trainers at 100+ clients spend 60% of their time on systems and business development, and only 40% on direct training. Compare this to trainers stuck at 25 clients who spend 90% of their time on direct training.</p>
</div>
<h2>The Four Pillars of Scalable Training Businesses</h2>
<h3>1. Standardized Training Protocols</h3>
<p>Create consistent, repeatable training methods that produce reliable results regardless of which trainer delivers them. This includes:</p>
<ul>
<li>Standardized command dictionary with hand signals</li>
<li>Assessment protocols for new dogs</li>
<li>Progress tracking metrics that all trainers use</li>
<li>Client communication templates</li>
</ul>
<p>When every trainer follows the same protocols, clients receive consistent experiences, and you can confidently guarantee results.</p>
<h3>2. Efficient Client Management Systems</h3>
<p>Manual scheduling, paper records, and email-based communication become impossible bottlenecks beyond 30 clients. Successful scaling requires:</p>
<ul>
<li>Automated scheduling and booking systems</li>
<li>Digital progress tracking and reporting</li>
<li>Streamlined payment processing</li>
<li>Client portal for homework and progress updates</li>
</ul>
<div class="quote-box">
"Moving to a digital management system saved me 15 hours per week in admin time. That's 15 hours I can spend training dogs or developing my business." - Mark Thompson, Professional Dog Trainer, London
</div>
<h3>3. Strategic Team Building</h3>
<p>You can't personally train 100+ dogs. Building a team doesn't mean losing control—it means multiplying your impact:</p>
<ul>
<li>Hire trainers who share your philosophy and methods</li>
<li>Create comprehensive training programs for new team members</li>
<li>Implement quality control and feedback systems</li>
<li>Develop clear career progression paths</li>
</ul>
<h3>4. Data-Driven Decision Making</h3>
<p>Growing businesses need metrics to guide decisions. Track these essential KPIs:</p>
<ul>
<li>Client acquisition cost and lifetime value</li>
<li>Training success rates by program type</li>
<li>Trainer utilization and efficiency metrics</li>
<li>Client satisfaction and retention rates</li>
</ul>
<h2>The Scaling Timeline: What to Expect</h2>
<p>Based on our analysis of successful scaling stories, here's a realistic timeline:</p>
<ul>
<li><strong>Months 1-3:</strong> Systems setup and process documentation</li>
<li><strong>Months 4-6:</strong> First hire and team training</li>
<li><strong>Months 7-12:</strong> Marketing acceleration and capacity building</li>
<li><strong>Year 2:</strong> Team expansion and market dominance</li>
</ul>
<div class="callout-box">
<h4>⚠️ Common Pitfall</h4>
<p>Many trainers try to scale too quickly without proper systems. This leads to quality issues, stressed teams, and ultimately business failure. Take time to build strong foundations before aggressive growth.</p>
</div>
<h2>Technology: Your Scaling Secret Weapon</h2>
<p>The right technology stack can automate 70% of administrative tasks, freeing you to focus on training and growth. Essential tools include:</p>
<ul>
<li>Comprehensive business management software</li>
<li>Online booking and payment systems</li>
<li>Progress tracking and reporting tools</li>
<li>Client communication platforms</li>
</ul>
<p>While there are general business tools available, purpose-built solutions for dog training businesses offer specialized features like command tracking, behavioral assessments, and training-specific reporting that generic tools can't match.</p>
<h2>Pricing Strategy for Scale</h2>
<p>As you scale, your pricing strategy must evolve. Consider these approaches:</p>
<ul>
<li><strong>Package-based pricing:</strong> Reduces decision fatigue and increases average transaction value</li>
<li><strong>Tiered service levels:</strong> Premium, standard, and basic options to capture different market segments</li>
<li><strong>Group training programs:</strong> Higher profit margins and efficient trainer utilization</li>
<li><strong>Maintenance programs:</strong> Recurring revenue for long-term client relationships</li>
</ul>
<h2>Action Steps to Start Scaling Today</h2>
<p>Ready to begin your scaling journey? Here's your immediate action plan:</p>
<ol>
<li>Document your current training protocols and identify inconsistencies</li>
<li>Audit your current client management process for bottlenecks</li>
<li>Research business management software options</li>
<li>Create job descriptions for your first hire</li>
<li>Develop standard operating procedures for all client interactions</li>
</ol>
<p>Remember, scaling is a marathon, not a sprint. Focus on building strong systems that can support sustainable growth, and you'll join the ranks of trainers successfully managing 100+ clients while maintaining the quality that makes your business special.</p>
<div class="callout-box">
<h4>🚀 Ready to Scale?</h4>
<p>If you're serious about scaling your dog training business, consider investing in purpose-built business management software. The time you save on administration can be reinvested in growth activities that actually move your business forward.</p>
</div>
</div>
<div class="article-tags">
<span class="tags-label">Tags:</span>
<div class="tags-list">
<a href="#" class="tag">business scaling</a>
<a href="#" class="tag">dog training business</a>
<a href="#" class="tag">team building</a>
<a href="#" class="tag">business systems</a>
<a href="#" class="tag">client management</a>
<a href="#" class="tag">professional development</a>
</div>
</div>
</article>
<!-- Sidebar -->
<aside class="sidebar">
<!-- Social Share -->
<div class="social-share">
<h3 class="share-title">Share This Article</h3>
<div class="share-buttons">
<a href="#" class="share-btn share-twitter">
<span>🐦</span>
Twitter
</a>
<a href="#" class="share-btn share-linkedin">
<span>💼</span>
LinkedIn
</a>
<a href="#" class="share-btn share-facebook">
<span>📘</span>
Facebook
</a>
</div>
</div>
<!-- Author Bio -->
<div class="sidebar-widget">
<h3 class="widget-title">About the Author</h3>
<div class="author-bio">
<div class="author-bio-avatar">SM</div>
<h4>Sarah Mitchell</h4>
<p>Sarah is a certified professional dog trainer with over 12 years of experience. She has successfully scaled her own training business from a solo operation to a team of 8 trainers serving 200+ clients across Manchester.</p>
<p>Sarah specializes in helping other trainers grow their businesses through proven systems and strategies.</p>
</div>
</div>
<!-- Related Posts -->
<div class="sidebar-widget">
<h3 class="widget-title">Related Articles</h3>
<ul class="related-posts">
<li class="related-post-item">
<a href="#" class="related-post-title">Building Your First Team: Hiring Dog Trainers That Fit Your Culture</a>
<div class="related-post-date">March 12, 2025</div>
</li>
<li class="related-post-item">
<a href="#" class="related-post-title">Pricing Strategies That Actually Work for Dog Training Businesses</a>
<div class="related-post-date">March 10, 2025</div>
</li>
<li class="related-post-item">
<a href="#" class="related-post-title">The Complete Guide to Dog Training Business Management Software</a>
<div class="related-post-date">March 8, 2025</div>
</li>
<li class="related-post-item">
<a href="#" class="related-post-title">Creating Standard Operating Procedures for Dog Training</a>
<div class="related-post-date">March 5, 2025</div>
</li>
</ul>
</div>
<!-- Newsletter Signup -->
<div class="sidebar-widget">
<h3 class="widget-title">Weekly Business Tips</h3>
<p style="margin-bottom: 1rem; color: #666;">Get proven strategies delivered to your inbox every Tuesday. Join 2,400+ successful dog trainers.</p>
<form class="newsletter-form">
<input type="email" class="newsletter-input" placeholder="Your email address" required>
<button type="submit" class="newsletter-btn">Subscribe Now</button>
</form>
</div>
</aside>
</div>
<!-- Post Navigation -->
<nav class="post-navigation">
<a href="#" class="nav-post prev">
<span class="nav-label">← Previous Post</span>
<div class="nav-title">5 Essential Commands Every Dog Owner Should Master</div>
</a>
<a href="#" class="nav-post next">
<span class="nav-label">Next Post →</span>
<div class="nav-title">Creating Effective Training Reports for Your Clients</div>
</a>
</nav>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="container">
<p>&copy; 2025 Fetch Metrics. Empowering professional dog trainers across the UK.</p>
</div>
</footer>
</body>
</html>

View File

@@ -0,0 +1,603 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog - Fetch Metrics | Dog Training Business Insights</title>
<meta name="description" content="Expert insights, tips, and strategies for professional dog trainers. Learn how to grow your training business with Fetch Metrics.">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8f9fa;
}
/* Header */
.header {
background: linear-gradient(135deg, #2c5282 0%, #3182ce 100%);
color: white;
padding: 1rem 0;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
color: #ff6b35;
}
.nav-links {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-links a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.nav-links a:hover {
color: #ff6b35;
}
.blog-header {
text-align: center;
padding: 2rem 0;
}
.blog-header h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
}
.blog-header p {
font-size: 1.2rem;
opacity: 0.9;
max-width: 600px;
margin: 0 auto;
}
/* Main Content */
.main-content {
padding: 3rem 0;
}
.blog-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 3rem;
margin-bottom: 3rem;
}
/* Featured Post */
.featured-post {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
transition: transform 0.3s, box-shadow 0.3s;
}
.featured-post:hover {
transform: translateY(-5px);
box-shadow: 0 8px 30px rgba(0,0,0,0.15);
}
.featured-image {
height: 300px;
background: linear-gradient(45deg, #ff6b35, #f093fb);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 3rem;
}
.featured-content {
padding: 2rem;
}
.post-category {
display: inline-block;
background: #ff6b35;
color: white;
padding: 0.3rem 1rem;
border-radius: 20px;
font-size: 0.8rem;
font-weight: 600;
margin-bottom: 1rem;
}
.featured-content h2 {
font-size: 1.8rem;
margin-bottom: 1rem;
color: #2d3748;
line-height: 1.3;
}
.post-excerpt {
color: #666;
margin-bottom: 1.5rem;
line-height: 1.7;
}
.post-meta {
display: flex;
align-items: center;
gap: 1rem;
font-size: 0.9rem;
color: #888;
margin-bottom: 1rem;
}
.read-more {
display: inline-flex;
align-items: center;
color: #3182ce;
text-decoration: none;
font-weight: 600;
transition: color 0.3s;
}
.read-more:hover {
color: #2c5282;
}
.read-more::after {
content: ' →';
margin-left: 0.5rem;
transition: margin-left 0.3s;
}
.read-more:hover::after {
margin-left: 1rem;
}
/* Sidebar */
.sidebar {
display: flex;
flex-direction: column;
gap: 2rem;
}
.sidebar-widget {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
}
.widget-title {
font-size: 1.3rem;
margin-bottom: 1.5rem;
color: #2d3748;
border-bottom: 2px solid #ff6b35;
padding-bottom: 0.5rem;
}
.category-list {
list-style: none;
}
.category-list li {
padding: 0.8rem 0;
border-bottom: 1px solid #e2e8f0;
display: flex;
justify-content: space-between;
}
.category-list li:last-child {
border-bottom: none;
}
.category-list a {
color: #4a5568;
text-decoration: none;
transition: color 0.3s;
}
.category-list a:hover {
color: #3182ce;
}
.post-count {
background: #e2e8f0;
color: #4a5568;
padding: 0.2rem 0.6rem;
border-radius: 12px;
font-size: 0.8rem;
}
.recent-posts {
list-style: none;
}
.recent-post-item {
padding: 1rem 0;
border-bottom: 1px solid #e2e8f0;
}
.recent-post-item:last-child {
border-bottom: none;
}
.recent-post-title {
font-weight: 600;
color: #2d3748;
text-decoration: none;
transition: color 0.3s;
display: block;
margin-bottom: 0.3rem;
}
.recent-post-title:hover {
color: #3182ce;
}
.recent-post-date {
font-size: 0.8rem;
color: #888;
}
/* Blog Posts Grid */
.blog-posts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
margin-top: 2rem;
}
.blog-post-card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0,0,0,0.08);
transition: transform 0.3s, box-shadow 0.3s;
}
.blog-post-card:hover {
transform: translateY(-3px);
box-shadow: 0 6px 25px rgba(0,0,0,0.12);
}
.post-image {
height: 200px;
background: linear-gradient(45deg, #667eea, #764ba2);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 2rem;
}
.post-content {
padding: 1.5rem;
}
.post-content h3 {
font-size: 1.3rem;
margin-bottom: 1rem;
color: #2d3748;
line-height: 1.3;
}
/* Newsletter Signup */
.newsletter-form {
display: flex;
flex-direction: column;
gap: 1rem;
}
.newsletter-input {
padding: 1rem;
border: 2px solid #e2e8f0;
border-radius: 8px;
font-size: 1rem;
transition: border-color 0.3s;
}
.newsletter-input:focus {
outline: none;
border-color: #3182ce;
}
.newsletter-btn {
background: #ff6b35;
color: white;
border: none;
padding: 1rem;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.3s;
}
.newsletter-btn:hover {
background: #e55a2b;
}
/* Footer */
.footer {
background: #2d3748;
color: white;
text-align: center;
padding: 2rem 0;
margin-top: 4rem;
}
/* Responsive */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
text-align: center;
}
.nav-links {
flex-wrap: wrap;
justify-content: center;
}
.blog-header h1 {
font-size: 2rem;
}
.blog-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.blog-posts-grid {
grid-template-columns: 1fr;
}
.featured-content h2 {
font-size: 1.5rem;
}
}
</style>
</head>
<body>
<!-- Header -->
<header class="header">
<div class="container">
<nav class="nav">
<div class="logo">🐕 Fetch Metrics</div>
<ul class="nav-links">
<li><a href="#home">Home</a></li>
<li><a href="#features">Features</a></li>
<li><a href="#pricing">Pricing</a></li>
<li><a href="#blog">Blog</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
<div class="blog-header">
<h1>Dog Training Business Insights</h1>
<p>Expert tips, industry trends, and practical advice to help you grow your professional dog training business</p>
</div>
</div>
</header>
<!-- Main Content -->
<main class="main-content">
<div class="container">
<div class="blog-grid">
<!-- Featured Post -->
<article class="featured-post">
<div class="featured-image">🎯</div>
<div class="featured-content">
<span class="post-category">Business Growth</span>
<h2>How to Scale Your Dog Training Business from 25 to 100+ Clients</h2>
<div class="post-meta">
<span>📅 March 15, 2025</span>
<span>⏱️ 8 min read</span>
<span>👤 Sarah Mitchell</span>
</div>
<p class="post-excerpt">
Discover the proven strategies successful trainers use to systematically grow their client base while maintaining quality training standards. Learn about pricing models, scheduling systems, and client management techniques that actually work.
</p>
<a href="#" class="read-more">Read Full Article</a>
</div>
</article>
<!-- Sidebar -->
<aside class="sidebar">
<!-- Categories -->
<div class="sidebar-widget">
<h3 class="widget-title">Categories</h3>
<ul class="category-list">
<li>
<a href="#">Business Management</a>
<span class="post-count">12</span>
</li>
<li>
<a href="#">Training Techniques</a>
<span class="post-count">8</span>
</li>
<li>
<a href="#">Client Relations</a>
<span class="post-count">15</span>
</li>
<li>
<a href="#">Marketing & Growth</a>
<span class="post-count">6</span>
</li>
<li>
<a href="#">Technology & Tools</a>
<span class="post-count">9</span>
</li>
<li>
<a href="#">Industry News</a>
<span class="post-count">4</span>
</li>
</ul>
</div>
<!-- Recent Posts -->
<div class="sidebar-widget">
<h3 class="widget-title">Recent Posts</h3>
<ul class="recent-posts">
<li class="recent-post-item">
<a href="#" class="recent-post-title">5 Essential Commands Every Dog Owner Should Master</a>
<div class="recent-post-date">March 12, 2025</div>
</li>
<li class="recent-post-item">
<a href="#" class="recent-post-title">Creating Effective Training Reports for Your Clients</a>
<div class="recent-post-date">March 10, 2025</div>
</li>
<li class="recent-post-item">
<a href="#" class="recent-post-title">Handling Difficult Dogs: Professional Strategies</a>
<div class="recent-post-date">March 8, 2025</div>
</li>
<li class="recent-post-item">
<a href="#" class="recent-post-title">Pricing Your Training Services: A Complete Guide</a>
<div class="recent-post-date">March 5, 2025</div>
</li>
</ul>
</div>
<!-- Newsletter Signup -->
<div class="sidebar-widget">
<h3 class="widget-title">Stay Updated</h3>
<p style="margin-bottom: 1rem; color: #666;">Get weekly insights and tips delivered to your inbox.</p>
<form class="newsletter-form">
<input type="email" class="newsletter-input" placeholder="Your email address" required>
<button type="submit" class="newsletter-btn">Subscribe Now</button>
</form>
</div>
</aside>
</div>
<!-- More Blog Posts -->
<section class="blog-posts-grid">
<article class="blog-post-card">
<div class="post-image">📊</div>
<div class="post-content">
<span class="post-category">Analytics</span>
<h3>Understanding Your Training Success Metrics</h3>
<div class="post-meta">
<span>📅 March 13, 2025</span>
<span>⏱️ 6 min read</span>
</div>
<p class="post-excerpt">
Learn which metrics matter most for measuring training progress and client satisfaction.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">🤝</div>
<div class="post-content">
<span class="post-category">Client Relations</span>
<h3>Building Long-term Client Relationships</h3>
<div class="post-meta">
<span>📅 March 11, 2025</span>
<span>⏱️ 5 min read</span>
</div>
<p class="post-excerpt">
Strategies for maintaining strong relationships with clients beyond the initial training period.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">💡</div>
<div class="post-content">
<span class="post-category">Training Techniques</span>
<h3>Command Dictionary: Essential Training Signals</h3>
<div class="post-meta">
<span>📅 March 9, 2025</span>
<span>⏱️ 7 min read</span>
</div>
<p class="post-excerpt">
A comprehensive guide to standardizing commands and hand signals for consistent training results.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">🚀</div>
<div class="post-content">
<span class="post-category">Business Growth</span>
<h3>Digital Marketing for Dog Trainers in 2025</h3>
<div class="post-meta">
<span>📅 March 7, 2025</span>
<span>⏱️ 9 min read</span>
</div>
<p class="post-excerpt">
Modern marketing strategies that actually work for professional dog training businesses.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">🎓</div>
<div class="post-content">
<span class="post-category">Professional Development</span>
<h3>Advanced Certification: Is It Worth It?</h3>
<div class="post-meta">
<span>📅 March 6, 2025</span>
<span>⏱️ 4 min read</span>
</div>
<p class="post-excerpt">
Exploring the ROI of advanced certifications and specialized training for professional trainers.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">📱</div>
<div class="post-content">
<span class="post-category">Technology</span>
<h3>Why Paper Records Are Holding You Back</h3>
<div class="post-meta">
<span>📅 March 4, 2025</span>
<span>⏱️ 6 min read</span>
</div>
<p class="post-excerpt">
The hidden costs of manual record-keeping and how digital solutions transform training businesses.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
</section>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="container">
<p>&copy; 2025 Fetch Metrics. Empowering professional dog trainers across the UK.</p>
</div>
</footer>
</body>
</html>

View File

@@ -0,0 +1,23 @@
// internal
import BasePage from "../base.js";
// external
export default class PageBlogArticle extends BasePage {
static hash = hashPageBlogHome;
constructor(router) {
super(router);
}
initialize() {
this.sharedInitialize();
// this.hookupButtonsNav();
}
leave() {
super.leave();
}
}

View File

@@ -0,0 +1,23 @@
// internal
import BasePage from "../base.js";
// external
export default class PageBlogHome extends BasePage {
static hash = hashPageBlogHome;
constructor(router) {
super(router);
}
initialize() {
this.sharedInitialize();
// this.hookupButtonsNav();
}
leave() {
super.leave();
}
}

View File

@@ -6,6 +6,8 @@ import PageContact from './pages/core/contact.js';
import PageContactSuccess from './pages/core/contact-success.js';
import PageApplyFoundingPartner from './pages/core/apply-founding-partner.js';
import PageApplyFoundingPartnerSuccess from './pages/core/apply-founding-partner-success.js';
// Blog
import PageBlogHome from './pages/blog/home.js';
// Dog
import PageDogHome from './pages/dog/home.js';
import PageDogCommandCategories from './pages/dog/command_categories.js';
@@ -46,6 +48,8 @@ export default class Router {
this.pages[hashPageContactSuccess] = { name: 'PageContactSuccess', module: PageContactSuccess };
this.pages[hashPageApplyFoundingPartner] = { name: 'PageApplyFoundingPartner', module: PageApplyFoundingPartner };
this.pages[hashPageApplyFoundingPartnerSuccess] = { name: 'PageApplyFoundingPartnerSuccess', module: PageApplyFoundingPartnerSuccess };
// Blog
this.pages[hashPageBlogHome] = { name: 'PageBlogHome', module: PageBlogHome };
// Dog
this.pages[hashPageDogHome] = { name: 'PageDogHome', module: PageDogHome };
this.pages[hashPageDogCommandCategories] = { name: 'PageDogCommands', module: PageDogCommandCategories };
@@ -77,6 +81,8 @@ export default class Router {
this.routes[hashPageContactSuccess] = (isPopState = false) => this.navigateToHash(hashPageContactSuccess, isPopState);
this.routes[hashPageApplyFoundingPartner] = (isPopState = false) => this.navigateToHash(hashPageApplyFoundingPartner, isPopState);
this.routes[hashPageApplyFoundingPartnerSuccess] = (isPopState = false) => this.navigateToHash(hashPageApplyFoundingPartnerSuccess, isPopState);
// Blog
this.routes[hashPageBlogHome] = (isPopState = false) => this.navigateToHash(hashPageBlogHome, isPopState);
// Dog
this.routes[hashPageDogHome] = (isPopState = false) => this.navigateToHash(hashPageDogHome, isPopState);
this.routes[hashPageDogCommandCategories] = (isPopState = false) => this.navigateToHash(hashPageDogCommandCategories, isPopState);

View File

@@ -20,6 +20,9 @@
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<a class="{{ model.FLAG_NAV_HOME }}" href="{{ model.HASH_PAGE_HOME }}">Home</a>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<a class="{{ model.FLAG_NAV_BLOG }}" href="{{ model.HASH_PAGE_BLOG }}">Blog</a>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<a class="{{ model.FLAG_NAV_CONTACT }}" href="{{ model.HASH_PAGE_CONTACT }}">Contact</a>
</div>

View File

@@ -77,6 +77,12 @@
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavApplyFoundingPartner = "{{ model.FLAG_NAV_APPLY_FOUNDING_PARTNER }}";
var flagNavBlogArticleHowToScaleYourDogTrainingBusiness = "{{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}";
var flagNavBlogArticleTheScienceBehindDogTrainingAssessments = "{{ model.FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}";
var flagNavBlogArticleWhyEveryDogTrainerNeedsACommandDictionary = "{{ model.FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}";
var flagNavBlogCategoryMarketingAndGrowth = "{{ model.FLAG_NAV_BLOG_CATEGORY_MARKETING_AND_GROWTH }}";
var flagNavBlogCategoryTrainingTechniques = "{{ model.FLAG_NAV_BLOG_CATEGORY_TRAINING_TECHNIQUES }}";
var flagNavBlogHome = "{{ model.FLAG_NAV_BLOG_HOME }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
var flagNavDogAssessments = "{{ model.FLAG_NAV_DOG_ASSESSMENTS }}";
@@ -125,6 +131,12 @@
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
var hashPageApplyFoundingPartner = "{{ model.HASH_PAGE_APPLY_FOUNDING_PARTNER }}";
var hashPageApplyFoundingPartnerSuccess = "{{ model.HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS }}";
var hashPageBlogArticleHowToScaleYourDogTrainingBusiness = "{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}";
var hashPageBlogArticleTheScienceBehindDogTrainingAssessments = "{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}";
var hashPageBlogArticleWhyEveryTrainerNeedsACommandDictionary = "{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}";
var hashPageBlogCategoryMarketingAndGrowth = "{{ model.HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH }}";
var hashPageBlogCategoryTrainingTechniques = "{{ model.HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES }}";
var hashPageBlogHome = "{{ model.HASH_PAGE_BLOG_HOME }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";

View File

@@ -0,0 +1,364 @@
<!DOCTYPE html>
<html lang="en-GB">
<head>
{% include 'layouts/_shared_head.html' %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_home.bundle.css') }}">
</head>
<body data-page="{{ model.hash_page_current }}">
<div class="topnav">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_LOGO }}">
<img class="{{ model.FLAG_LOGO }}" src="{{ url_for('static', filename='images/fetch-metrics-logo-and-company-name-horizontal-1-link-visited-LQ.webp') }}" alt="Fetch Metrics logo" aria-label="Fetch Metrics logo" tabindex="0"> {# filename='images/fetch-metrics-logo-and-company-name-radial-0.5-link-visited-LQ.webp', 'images/Wisp_LQ.webp' #}
</div>
<div class="nav-links">
<!--
<a href="#{{ model.FLAG_HOME }}">Home</a>
<a href="#{{ model.FLAG_FEATURES }}">Features</a>
<a href="#{{ model.FLAG_PRICING }}">Pricing</a>
<a href="#{{ model.FLAG_BLOG }}">Blog</a>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
-->
</div>
</div>
{% include 'layouts/_shared_header.html' %}
<!-- Body -->
<div id="{{ model.ID_PAGE_BODY }}">
<!-- Breadcrumb -->
<nav class="breadcrumb">
<div class="container">
<div class="breadcrumb-nav">
<a href="#home">Home</a>
<span>></span>
<a href="#blog">Blog</a>
<span>></span>
<span>How to Scale Your Dog Training Business</span>
</div>
</div>
</nav>
<div class="{{ model.FLAG_CONTAINER }}">
<div class="content-grid">
<!-- Article -->
<article class="article">
<header class="article-header">
<span class="article-category">Business Growth</span>
<h1 class="article-title">How to Scale Your Dog Training Business from 25 to 100+ Clients</h1>
<div class="article-meta">
<div class="author-info">
<div class="author-avatar">SM</div>
<div class="author-details">
<h4>Sarah Mitchell</h4>
<p>Professional Dog Trainer & Business Coach</p>
</div>
</div>
<div class="meta-item">
<span>📅</span>
<span>March 15, 2025</span>
</div>
<div class="meta-item">
<span>⏱️</span>
<span>8 min read</span>
</div>
<div class="meta-item">
<span>👀</span>
<span>1,247 views</span>
</div>
</div>
</header>
<div class="featured-image">🎯</div>
<div class="article-content">
<p>Growing a dog training business from 25 to 100+ clients isn't just about finding more customers—it's about building systems that can handle increased demand while maintaining the quality that made you successful in the first place.</p>
<p>After working with over 200 professional trainers across the UK, I've identified the key strategies that separate trainers who successfully scale from those who plateau at 20-30 clients. Let's dive into the proven framework that works.</p>
<h2>The Scaling Mindset Shift</h2>
<p>The biggest obstacle to scaling isn't finding more clients—it's the mental shift from "doing everything yourself" to "building systems that work without you." Many trainers fear that delegating or systematizing will compromise their training quality, but the opposite is true.</p>
<div class="callout-box">
<h4>💡 Key Insight</h4>
<p>Successful trainers at 100+ clients spend 60% of their time on systems and business development, and only 40% on direct training. Compare this to trainers stuck at 25 clients who spend 90% of their time on direct training.</p>
</div>
<h2>The Four Pillars of Scalable Training Businesses</h2>
<h3>1. Standardized Training Protocols</h3>
<p>Create consistent, repeatable training methods that produce reliable results regardless of which trainer delivers them. This includes:</p>
<ul>
<li>Standardized command dictionary with hand signals</li>
<li>Assessment protocols for new dogs</li>
<li>Progress tracking metrics that all trainers use</li>
<li>Client communication templates</li>
</ul>
<p>When every trainer follows the same protocols, clients receive consistent experiences, and you can confidently guarantee results.</p>
<h3>2. Efficient Client Management Systems</h3>
<p>Manual scheduling, paper records, and email-based communication become impossible bottlenecks beyond 30 clients. Successful scaling requires:</p>
<ul>
<li>Automated scheduling and booking systems</li>
<li>Digital progress tracking and reporting</li>
<li>Streamlined payment processing</li>
<li>Client portal for homework and progress updates</li>
</ul>
<div class="quote-box">
"Moving to a digital management system saved me 15 hours per week in admin time. That's 15 hours I can spend training dogs or developing my business." - Mark Thompson, Professional Dog Trainer, London
</div>
<h3>3. Strategic Team Building</h3>
<p>You can't personally train 100+ dogs. Building a team doesn't mean losing control—it means multiplying your impact:</p>
<ul>
<li>Hire trainers who share your philosophy and methods</li>
<li>Create comprehensive training programs for new team members</li>
<li>Implement quality control and feedback systems</li>
<li>Develop clear career progression paths</li>
</ul>
<h3>4. Data-Driven Decision Making</h3>
<p>Growing businesses need metrics to guide decisions. Track these essential KPIs:</p>
<ul>
<li>Client acquisition cost and lifetime value</li>
<li>Training success rates by program type</li>
<li>Trainer utilization and efficiency metrics</li>
<li>Client satisfaction and retention rates</li>
</ul>
<h2>The Scaling Timeline: What to Expect</h2>
<p>Based on our analysis of successful scaling stories, here's a realistic timeline:</p>
<ul>
<li><strong>Months 1-3:</strong> Systems setup and process documentation</li>
<li><strong>Months 4-6:</strong> First hire and team training</li>
<li><strong>Months 7-12:</strong> Marketing acceleration and capacity building</li>
<li><strong>Year 2:</strong> Team expansion and market dominance</li>
</ul>
<div class="callout-box">
<h4>⚠️ Common Pitfall</h4>
<p>Many trainers try to scale too quickly without proper systems. This leads to quality issues, stressed teams, and ultimately business failure. Take time to build strong foundations before aggressive growth.</p>
</div>
<h2>Technology: Your Scaling Secret Weapon</h2>
<p>The right technology stack can automate 70% of administrative tasks, freeing you to focus on training and growth. Essential tools include:</p>
<ul>
<li>Comprehensive business management software</li>
<li>Online booking and payment systems</li>
<li>Progress tracking and reporting tools</li>
<li>Client communication platforms</li>
</ul>
<p>While there are general business tools available, purpose-built solutions for dog training businesses offer specialized features like command tracking, behavioral assessments, and training-specific reporting that generic tools can't match.</p>
<h2>Pricing Strategy for Scale</h2>
<p>As you scale, your pricing strategy must evolve. Consider these approaches:</p>
<ul>
<li><strong>Package-based pricing:</strong> Reduces decision fatigue and increases average transaction value</li>
<li><strong>Tiered service levels:</strong> Premium, standard, and basic options to capture different market segments</li>
<li><strong>Group training programs:</strong> Higher profit margins and efficient trainer utilization</li>
<li><strong>Maintenance programs:</strong> Recurring revenue for long-term client relationships</li>
</ul>
<h2>Action Steps to Start Scaling Today</h2>
<p>Ready to begin your scaling journey? Here's your immediate action plan:</p>
<ol>
<li>Document your current training protocols and identify inconsistencies</li>
<li>Audit your current client management process for bottlenecks</li>
<li>Research business management software options</li>
<li>Create job descriptions for your first hire</li>
<li>Develop standard operating procedures for all client interactions</li>
</ol>
<p>Remember, scaling is a marathon, not a sprint. Focus on building strong systems that can support sustainable growth, and you'll join the ranks of trainers successfully managing 100+ clients while maintaining the quality that makes your business special.</p>
<div class="callout-box">
<h4>🚀 Ready to Scale?</h4>
<p>If you're serious about scaling your dog training business, consider investing in purpose-built business management software. The time you save on administration can be reinvested in growth activities that actually move your business forward.</p>
</div>
</div>
<div class="article-tags">
<span class="tags-label">Tags:</span>
<div class="tags-list">
<a href="#" class="tag">business scaling</a>
<a href="#" class="tag">dog training business</a>
<a href="#" class="tag">team building</a>
<a href="#" class="tag">business systems</a>
<a href="#" class="tag">client management</a>
<a href="#" class="tag">professional development</a>
</div>
</div>
</article>
<!-- Sidebar -->
<aside class="sidebar">
<!-- Social Share -->
<div class="social-share">
<h3 class="share-title">Share This Article</h3>
<div class="share-buttons">
<a href="#" class="share-btn share-twitter">
<span>🐦</span>
Twitter
</a>
<a href="#" class="share-btn share-linkedin">
<span>💼</span>
LinkedIn
</a>
<a href="#" class="share-btn share-facebook">
<span>📘</span>
Facebook
</a>
</div>
</div>
<!-- Author Bio -->
<div class="sidebar-widget">
<h3 class="widget-title">About the Author</h3>
<div class="author-bio">
<div class="author-bio-avatar">SM</div>
<h4>Sarah Mitchell</h4>
<p>Sarah is a certified professional dog trainer with over 12 years of experience. She has successfully scaled her own training business from a solo operation to a team of 8 trainers serving 200+ clients across Manchester.</p>
<p>Sarah specializes in helping other trainers grow their businesses through proven systems and strategies.</p>
</div>
</div>
<!-- Related Posts -->
<div class="sidebar-widget">
<h3 class="widget-title">Related Articles</h3>
<ul class="related-posts">
<li class="related-post-item">
<a href="#" class="related-post-title">Building Your First Team: Hiring Dog Trainers That Fit Your Culture</a>
<div class="related-post-date">March 12, 2025</div>
</li>
<li class="related-post-item">
<a href="#" class="related-post-title">Pricing Strategies That Actually Work for Dog Training Businesses</a>
<div class="related-post-date">March 10, 2025</div>
</li>
<li class="related-post-item">
<a href="#" class="related-post-title">The Complete Guide to Dog Training Business Management Software</a>
<div class="related-post-date">March 8, 2025</div>
</li>
<li class="related-post-item">
<a href="#" class="related-post-title">Creating Standard Operating Procedures for Dog Training</a>
<div class="related-post-date">March 5, 2025</div>
</li>
</ul>
</div>
<!-- Newsletter Signup -->
<div class="sidebar-widget">
<h3 class="widget-title">Weekly Business Tips</h3>
<p style="margin-bottom: 1rem; color: #666;">Get proven strategies delivered to your inbox every Tuesday. Join 2,400+ successful dog trainers.</p>
<form class="newsletter-form">
<input type="email" class="newsletter-input" placeholder="Your email address" required>
<button type="submit" class="newsletter-btn">Subscribe Now</button>
</form>
</div>
</aside>
</div>
<!-- Post Navigation -->
<nav class="post-navigation">
<a href="#" class="nav-post prev">
<span class="nav-label">← Previous Post</span>
<div class="nav-title">5 Essential Commands Every Dog Owner Should Master</div>
</a>
<a href="#" class="nav-post next">
<span class="nav-label">Next Post →</span>
<div class="nav-title">Creating Effective Training Reports for Your Clients</div>
</a>
</nav>
</div>
</div>
<!-- Footer -->
<footer class="footer">
<div class="{{ model.FLAG_CONTAINER }}">
<div class="footer-content">
<div class="footer-section">
<h3>{{ model.NAME_COMPANY }}</h3>
<p>Company Number: {{ model.COMPANY_NUMBER }}</p>
<p>Registered in England and Wales</p>
<p>Registered Office: {{ model.COMPANY_ADDRESS_SHORT }}</p>
</div>
<div class="footer-section">
<h3>Legal</h3>
<ul>
<li><a href="{{ model.HASH_PAGE_PRIVACY_POLICY }}">Privacy Policy</a></li>
<li><a href="{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}">Accessibility Statement</a></li>
</ul>
</div>
</div>
</div>
<div class="footer-content">
<div class="footer-section contact">
<h3>Contact</h3>
<!--
<ul>
<li><a href="mailto:{{ model.get_mail_contact_public() }}">Email: {{ model.get_mail_contact_public() }}</a></li>
<li><a href="{{ model.URL_DISCORD }}">Discord: {{ model.USERNAME_DISCORD }}</a></li>
< !-- <li><a href="{{ model.URL_FACEBOOK }}">Facebook: {{ model.USERNAME_FACEBOOK }}</a></li> -- >
<li><a href="{{ model.URL_GITHUB }}">GitHub: {{ model.USERNAME_GITHUB }}</a></li>
<li><a href="{{ model.URL_INSTAGRAM }}">Instagram: {{ model.USERNAME_INSTAGRAM }}</a></li>
</ul>
</div>
<div class="footer-section contact">
<h3 style="color: #1f2937;">Contact</h3>
<ul>
< !-- <li>Phone</li> -- >
< !-- <li><a href="{{ model.URL_LINKEDIN }}">LinkedIn: {{ model.USERNAME_LINKEDIN }}</a></li> -- >
<li><a href="{{ model.URL_REDDIT }}">Reddit: {{ model.USERNAME_REDDIT }}</a></li>
<li><a href="{{ model.URL_TIKTOK }}">TikTok: {{ model.USERNAME_TIKTOK }}</a></li>
<li><a href="{{ model.URL_TWITTER }}">Twitter: {{ model.USERNAME_TWITTER }}</a></li>
</ul>
-->
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="mailto:{{ model.get_mail_contact_public() }}"><strong>Email:</strong> {{ model.get_mail_contact_public() }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_DISCORD }}"><strong>Discord:</strong> {{ model.USERNAME_DISCORD }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_FACEBOOK }}"><strong>Facebook:</strong> {{ model.USERNAME_FACEBOOK }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_GITHUB }}"><strong>GitHub:</strong> {{ model.USERNAME_GITHUB }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_INSTAGRAM }}"><strong>Instagram:</strong> {{ model.USERNAME_INSTAGRAM }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_LINKEDIN }}"><strong>LinkedIn:</strong> {{ model.USERNAME_LINKEDIN }}</a></div>
<!-- <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><strong>Phone:</strong> {{ model.PHONE_NUMBER_CONTACT_PUBLIC }}</div> -->
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_REDDIT }}"><strong>Reddit:</strong> {{ model.USERNAME_REDDIT }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_TIKTOK }}"><strong>TikTok:</strong> {{ model.USERNAME_TIKTOK }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_TWITTER }}"><strong>Twitter:</strong> {{ model.USERNAME_TWITTER }}</a></div>
<!-- <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_YOUTUBE }}"><strong>Youtube:</strong> {{ model.USERNAME_YOUTUBE }}</a></div> -->
</div>
</div>
</div>
<div class="footer-bottom">
<p>&copy; {{ current_year }} {{ model.NAME_COMPANY }}. <a href="{{ model.HASH_PAGE_LICENSE }}" alt="License" aria-label="License">All rights reserved.</a></p>
</div>
</div>
</footer>
{% include 'layouts/_shared_scripts.html' %}
{% include 'layouts/_shared_dog_scripts.html' %}
<script src="{{ url_for('static', filename='dist/js/main.bundle.js') }}"></script>
</body>
</html>

View File

@@ -0,0 +1,305 @@
<!DOCTYPE html>
<html lang="en-GB">
<head>
{% include 'layouts/_shared_head.html' %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_home.bundle.css') }}">
</head>
<body data-page="{{ model.hash_page_current }}">
<div class="topnav">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_LOGO }}">
<img class="{{ model.FLAG_LOGO }}" src="{{ url_for('static', filename='images/fetch-metrics-logo-and-company-name-horizontal-1-link-visited-LQ.webp') }}" alt="Fetch Metrics logo" aria-label="Fetch Metrics logo" tabindex="0"> {# filename='images/fetch-metrics-logo-and-company-name-radial-0.5-link-visited-LQ.webp', 'images/Wisp_LQ.webp' #}
</div>
<div class="nav-links">
<!--
<a href="#{{ model.FLAG_HOME }}">Home</a>
<a href="#{{ model.FLAG_FEATURES }}">Features</a>
<a href="#{{ model.FLAG_PRICING }}">Pricing</a>
<a href="#{{ model.FLAG_BLOG }}">Blog</a>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
-->
</div>
</div>
{% include 'layouts/_shared_header.html' %}
<!-- Body -->
<div id="{{ model.ID_PAGE_BODY }}">
<section class="hero">
<div class="{{ model.FLAG_CONTAINER }}">
<div class="hero-content" data-aos="fade-up">
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_SUCCESS }}">NOW AVAILABLE</a> -->
<h1>Dog Training Business Insights</h1>
<p>Expert tips, industry trends, and practical advice to help you grow your professional dog training business</p>
</div>
</div>
</section>
<div class="{{ model.FLAG_CONTAINER }}">
<div class="blog-grid">
<!-- Featured Post -->
<article class="featured-post">
<div class="featured-image">🎯</div>
<div class="featured-content">
<span class="post-category">Business Growth</span>
<h2>How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</h2>
<div class="post-meta">
<span>📅 9th August 2025</span>
<span>⏱️ 8 min read</span>
<span>👤 <a href="{{ model.URL_LINKEDIN_PERSONAL }}">Teddy Middleton-Smith</a></span>
</div>
<p class="post-excerpt">
Discover how UK dog trainers use Fetch Metrics to scale from solo practices to multi-trainer businesses. Professional dog training management software for growing businesses.
</p>
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}" class="read-more {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}">Read Full Article</a>
</div>
</article>
<!-- Sidebar -->
<aside class="sidebar">
<!-- Categories -->
<div class="sidebar-widget">
<h3 class="widget-title">Categories</h3>
<ul class="category-list">
<!--
<li>
<a href="#">Business Management</a>
<span class="post-count">12</span>
</li>
-->
<li>
<a href="{{ model.HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES }}" class="{{ model.FLAG_NAV_BLOG_CATEGORY_TRAINING_TECHNIQUES }}">Training Techniques</a>
<span class="post-count">2</span>
</li>
<!--
<li>
<a href="#">Client Relations</a>
<span class="post-count">15</span>
</li>
-->
<li>
<a href="{{ model.HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH }}" class="{{ model.FLAG_NAV_BLOG_CATEGORY_MARKETING_AND_GROWTH }}">Marketing & Growth</a>
<span class="post-count">1</span>
</li>
<!--
<li>
<a href="#">Technology & Tools</a>
<span class="post-count">9</span>
</li>
<li>
<a href="#">Industry News</a>
<span class="post-count">4</span>
</li>
-->
</ul>
</div>
<!-- Recent Posts -->
<div class="sidebar-widget">
<h3 class="widget-title">Recent Posts</h3>
<ul class="recent-posts">
<li class="recent-post-item">
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}">Why Every Professional Dog Trainer Needs a Command Dictionary in 2025</a>
<div class="recent-post-date">10th August 2025</div>
</li>
<li class="recent-post-item">
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}">The Science Behind Dog Training Assessments: How to Track Real Progress</a>
<div class="recent-post-date">9th August 2025</div>
</li>
<li class="recent-post-item">
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}">How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</a>
<div class="recent-post-date">8th August 2025</div>
</li>
<!--
<li class="recent-post-item">
<a href="#" class="recent-post-title">Pricing Your Training Services: A Complete Guide</a>
<div class="recent-post-date">March 5, 2025</div>
</li>
-->
</ul>
</div>
<!-- Newsletter Signup -->
<div class="sidebar-widget">
<h3 class="widget-title">Stay Updated</h3>
<p style="margin-bottom: 1rem; color: #666;">Get weekly insights and tips delivered to your inbox.</p>
<form class="newsletter-form">
<input type="email" class="newsletter-input" placeholder="Your email address" required>
<button type="submit" class="newsletter-btn">Subscribe Now</button>
</form>
</div>
</aside>
</div>
<!-- More Blog Posts -- >
<section class="blog-posts-grid">
<article class="blog-post-card">
<div class="post-image">📊</div>
<div class="post-content">
<span class="post-category">Analytics</span>
<h3>Understanding Your Training Success Metrics</h3>
<div class="post-meta">
<span>📅 March 13, 2025</span>
<span>⏱️ 6 min read</span>
</div>
<p class="post-excerpt">
Learn which metrics matter most for measuring training progress and client satisfaction.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">🤝</div>
<div class="post-content">
<span class="post-category">Client Relations</span>
<h3>Building Long-term Client Relationships</h3>
<div class="post-meta">
<span>📅 March 11, 2025</span>
<span>⏱️ 5 min read</span>
</div>
<p class="post-excerpt">
Strategies for maintaining strong relationships with clients beyond the initial training period.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">💡</div>
<div class="post-content">
<span class="post-category">Training Techniques</span>
<h3>Command Dictionary: Essential Training Signals</h3>
<div class="post-meta">
<span>📅 March 9, 2025</span>
<span>⏱️ 7 min read</span>
</div>
<p class="post-excerpt">
A comprehensive guide to standardizing commands and hand signals for consistent training results.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">🚀</div>
<div class="post-content">
<span class="post-category">Business Growth</span>
<h3>Digital Marketing for Dog Trainers in 2025</h3>
<div class="post-meta">
<span>📅 March 7, 2025</span>
<span>⏱️ 9 min read</span>
</div>
<p class="post-excerpt">
Modern marketing strategies that actually work for professional dog training businesses.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">🎓</div>
<div class="post-content">
<span class="post-category">Professional Development</span>
<h3>Advanced Certification: Is It Worth It?</h3>
<div class="post-meta">
<span>📅 March 6, 2025</span>
<span>⏱️ 4 min read</span>
</div>
<p class="post-excerpt">
Exploring the ROI of advanced certifications and specialized training for professional trainers.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
<article class="blog-post-card">
<div class="post-image">📱</div>
<div class="post-content">
<span class="post-category">Technology</span>
<h3>Why Paper Records Are Holding You Back</h3>
<div class="post-meta">
<span>📅 March 4, 2025</span>
<span>⏱️ 6 min read</span>
</div>
<p class="post-excerpt">
The hidden costs of manual record-keeping and how digital solutions transform training businesses.
</p>
<a href="#" class="read-more">Read More</a>
</div>
</article>
</section>
-->
</div>
</div>
<!-- Footer -->
<footer class="footer">
<div class="{{ model.FLAG_CONTAINER }}">
<div class="footer-content">
<div class="footer-section">
<h3>{{ model.NAME_COMPANY }}</h3>
<p>Company Number: {{ model.COMPANY_NUMBER }}</p>
<p>Registered in England and Wales</p>
<p>Registered Office: {{ model.COMPANY_ADDRESS_SHORT }}</p>
</div>
<div class="footer-section">
<h3>Legal</h3>
<ul>
<li><a href="{{ model.HASH_PAGE_PRIVACY_POLICY }}">Privacy Policy</a></li>
<li><a href="{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}">Accessibility Statement</a></li>
</ul>
</div>
</div>
</div>
<div class="footer-content">
<div class="footer-section contact">
<h3>Contact</h3>
<!--
<ul>
<li><a href="mailto:{{ model.get_mail_contact_public() }}">Email: {{ model.get_mail_contact_public() }}</a></li>
<li><a href="{{ model.URL_DISCORD }}">Discord: {{ model.USERNAME_DISCORD }}</a></li>
< !-- <li><a href="{{ model.URL_FACEBOOK }}">Facebook: {{ model.USERNAME_FACEBOOK }}</a></li> -- >
<li><a href="{{ model.URL_GITHUB }}">GitHub: {{ model.USERNAME_GITHUB }}</a></li>
<li><a href="{{ model.URL_INSTAGRAM }}">Instagram: {{ model.USERNAME_INSTAGRAM }}</a></li>
</ul>
</div>
<div class="footer-section contact">
<h3 style="color: #1f2937;">Contact</h3>
<ul>
< !-- <li>Phone</li> -- >
< !-- <li><a href="{{ model.URL_LINKEDIN }}">LinkedIn: {{ model.USERNAME_LINKEDIN }}</a></li> -- >
<li><a href="{{ model.URL_REDDIT }}">Reddit: {{ model.USERNAME_REDDIT }}</a></li>
<li><a href="{{ model.URL_TIKTOK }}">TikTok: {{ model.USERNAME_TIKTOK }}</a></li>
<li><a href="{{ model.URL_TWITTER }}">Twitter: {{ model.USERNAME_TWITTER }}</a></li>
</ul>
-->
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="mailto:{{ model.get_mail_contact_public() }}"><strong>Email:</strong> {{ model.get_mail_contact_public() }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_DISCORD }}"><strong>Discord:</strong> {{ model.USERNAME_DISCORD }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_FACEBOOK }}"><strong>Facebook:</strong> {{ model.USERNAME_FACEBOOK }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_GITHUB }}"><strong>GitHub:</strong> {{ model.USERNAME_GITHUB }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_INSTAGRAM }}"><strong>Instagram:</strong> {{ model.USERNAME_INSTAGRAM }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_LINKEDIN }}"><strong>LinkedIn:</strong> {{ model.USERNAME_LINKEDIN }}</a></div>
<!-- <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><strong>Phone:</strong> {{ model.PHONE_NUMBER_CONTACT_PUBLIC }}</div> -->
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_REDDIT }}"><strong>Reddit:</strong> {{ model.USERNAME_REDDIT }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_TIKTOK }}"><strong>TikTok:</strong> {{ model.USERNAME_TIKTOK }}</a></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_TWITTER }}"><strong>Twitter:</strong> {{ model.USERNAME_TWITTER }}</a></div>
<!-- <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_YOUTUBE }}"><strong>Youtube:</strong> {{ model.USERNAME_YOUTUBE }}</a></div> -->
</div>
</div>
</div>
<div class="footer-bottom">
<p>&copy; {{ current_year }} {{ model.NAME_COMPANY }}. <a href="{{ model.HASH_PAGE_LICENSE }}" alt="License" aria-label="License">All rights reserved.</a></p>
</div>
</div>
</footer>
{% include 'layouts/_shared_scripts.html' %}
{% include 'layouts/_shared_dog_scripts.html' %}
<script src="{{ url_for('static', filename='dist/js/main.bundle.js') }}"></script>
</body>
</html>

View File

@@ -31,7 +31,7 @@ module.exports = {
core_home: [
path.resolve(__dirname, 'static/css/sections/core.css'),
path.resolve(__dirname, 'static/css/pages/core/home.css')
],
],
core_contact: [
path.resolve(__dirname, 'static/css/sections/core.css'),
path.resolve(__dirname, 'static/css/pages/core/contact.css')
@@ -45,6 +45,19 @@ module.exports = {
path.resolve(__dirname, 'static/css/sections/core.css'),
path.resolve(__dirname, 'static/css/pages/core/admin_home.css')
],
// Blog
blog_home: [
path.resolve(__dirname, 'static/css/sections/core.css'),
path.resolve(__dirname, 'static/css/pages/core/home.css'),
path.resolve(__dirname, 'static/css/sections/blog.css'),
path.resolve(__dirname, 'static/css/pages/blog/home.css')
],
blog_article: [
path.resolve(__dirname, 'static/css/sections/core.css'),
path.resolve(__dirname, 'static/css/pages/core/home.css'),
path.resolve(__dirname, 'static/css/sections/blog.css'),
path.resolve(__dirname, 'static/css/pages/blog/article.css')
],
// Legal
/*
legal_accessibility_report: [