first theme commit
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.DS_Store
|
||||
node_modules/
|
46
404.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 404 Error template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<section class="h-full overflow-scroll no-scrollbar bg-white pt-16 pb-24">
|
||||
|
||||
<div class="flex flex-col justify-center">
|
||||
|
||||
<div class="flex flex-col items-center py-8 justify-center">
|
||||
<!-- Logo -->
|
||||
<a class="flex flex-col items-center space-x-4" href="<?php echo get_site_url(); ?>">
|
||||
<p class="px-4 py-2 bg-red-500 text-white shadow-md rounded-md">Error 404</p>
|
||||
<div class="flex items-center justify-center">
|
||||
<h1 class="text-2xl p-4">Page not found...</h1>
|
||||
</div>
|
||||
<div class="flex justify-center mb-8">
|
||||
<a class="flex items-center ml-4" href="index.html"><img src="https://harplabs.com/wp-content/uploads/2017/12/logo-black.png" alt="harplabs logo" width="220" /></a>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Go Home -->
|
||||
<div class="flex items-center justify-center my-4">
|
||||
<a class="flex flex-col items-center space-x-4" href="<?php echo get_site_url(); ?>">
|
||||
<div class="flex items-center justify-center">
|
||||
<h1 class="font-medium text-2xl p-4">Go home</h1>
|
||||
<i class="bi-house-fill inline font-medium text-2xl p-4"></i>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
138
archive-solutions.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Solutions Archive Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<?php get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Contact Us -->
|
||||
<section class="bg-gray-100">
|
||||
|
||||
<div id="contact-tabs" class="py-8 px-4 max-w-7xl mx-auto">
|
||||
|
||||
<div>
|
||||
|
||||
<div class="flex space-x-2 items-center mb-4">
|
||||
<i class="bi-info-circle-fill"></i>
|
||||
<p class="font-medium text-lg">Please select a service category</p>
|
||||
</div>
|
||||
|
||||
<div class="md:hidden">
|
||||
|
||||
<label for="tabs" class="sr-only">
|
||||
Please Select a tab to view the registration form
|
||||
</label>
|
||||
|
||||
<select id="tabs" name="tabs" class="block w-full rounded-md border-gray-300 focus:border-indigo-500 focus:ring-indigo-500">
|
||||
<!-- Dynamically generate options -->
|
||||
<?php
|
||||
$args = array(
|
||||
'post_type' => 'solutions',
|
||||
'posts_per_page' => -1,
|
||||
'orderby' => 'date',
|
||||
'order' => 'ASC',
|
||||
);
|
||||
$query = new WP_Query($args);
|
||||
if ($query->have_posts()) {
|
||||
while ($query->have_posts()) {
|
||||
$query->the_post(); ?>
|
||||
<option value="<?= esc_attr(get_post_field('post_name', get_the_ID())) ?>"><?php the_title(); ?></option>
|
||||
<?php }
|
||||
// wp_reset_postdata();
|
||||
} else {
|
||||
// No posts found
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Tabs -->
|
||||
<div class="hidden md:block">
|
||||
<nav class="isolate flex divide-x divide-gray-200 rounded-lg shadow" aria-label="Tabs">
|
||||
<!-- Dynamically generate tab links -->
|
||||
|
||||
<?php while ($query->have_posts()) {
|
||||
$query->the_post();
|
||||
$title = get_the_title() ?>
|
||||
<button class="tab-link rounded-l-lg group relative min-w-0 flex-1 overflow-hidden py-4 px-4 text-center text-sm font-medium focus:z-10" data-tab="<?= esc_attr(get_post_field('post_name', get_the_ID())) ?>">
|
||||
|
||||
<div>
|
||||
<img src="<?= get_field('solution_image') ?>">
|
||||
<p class="font-medium"><?php _e($title, 'harplabs'); ?></p>
|
||||
</div>
|
||||
|
||||
|
||||
</button>
|
||||
<?php }
|
||||
// wp_reset_postdata();
|
||||
?>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="py-8">
|
||||
|
||||
<?php while ($query->have_posts()) {
|
||||
$query->the_post(); ?>
|
||||
<!-- Dynamically Generated Tabs -->
|
||||
<div id="<?= esc_attr(get_post_field('post_name', get_the_ID())) ?>" class="tab">
|
||||
|
||||
<div class="flex-1">
|
||||
|
||||
<h2 class="font-medium"><?= get_field("solution_products_list_subheading") ?>...</h2>
|
||||
|
||||
<h1 class="font-bold text-3xl md:text-4xl lg:text-5xl"><?= the_title() ?></h1>
|
||||
|
||||
<img class="md:hidden" src="<?= get_field('solution_image') ?>">
|
||||
|
||||
<ul class="py-4">
|
||||
<?php while (have_rows('solution_facts_and_data')) :
|
||||
|
||||
the_row();
|
||||
$sub_value = get_sub_field('solution_fact'); ?>
|
||||
|
||||
<li class="flex space-x-4">
|
||||
<i class="bi-check-circle-fill"></i>
|
||||
<p><?php echo $sub_value; ?></p>
|
||||
</li>
|
||||
|
||||
<?php endwhile; ?>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="mt-4">
|
||||
|
||||
<a href="<?php the_permalink() ?>" class="w-full text-center rounded-md border border-black bg-stone-100 px-8 py-2.5 text-sm font-semibold shadow-sm hover:bg-stone-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-yellow-600 uppercase">Learn More <i class="ml-4 bi-arrow-right"></i></a>
|
||||
</div>
|
||||
|
||||
<ul class="list-disc list-inside py-4">
|
||||
<li>No Payment Required</li>
|
||||
<li>No Strings Attached</li>
|
||||
<li>100% Risk-Free</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php }
|
||||
wp_reset_postdata();
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
6179
assets/css/bootstrap-icons.css
vendored
Normal file
10570
assets/css/font-awesome.css
vendored
Normal file
3
assets/css/styles-wp-admin.css
Normal file
@@ -0,0 +1,3 @@
|
||||
#wpwrap #toplevel_page_gf_edit_forms .update-plugins {
|
||||
display: none;
|
||||
}
|
3538
assets/css/styles.css
Normal file
BIN
assets/fonts/bootstrap-icons.woff
Normal file
BIN
assets/fonts/bootstrap-icons.woff2
Normal file
BIN
assets/fonts/fa-brands-400.ttf
Normal file
BIN
assets/fonts/fa-brands-400.woff2
Normal file
BIN
assets/fonts/fa-regular-400.ttf
Normal file
BIN
assets/fonts/fa-regular-400.woff2
Normal file
BIN
assets/fonts/fa-solid-900.ttf
Normal file
BIN
assets/fonts/fa-solid-900.woff2
Normal file
BIN
assets/fonts/fa-v4compatibility.ttf
Normal file
BIN
assets/fonts/fa-v4compatibility.woff2
Normal file
BIN
assets/images/bgs/7apps.png
Normal file
After Width: | Height: | Size: 418 KiB |
BIN
assets/images/bgs/harpLabsbg.png
Normal file
After Width: | Height: | Size: 281 KiB |
BIN
assets/images/bgs/here-to-help.jpg
Normal file
After Width: | Height: | Size: 240 KiB |
BIN
assets/images/bgs/system-experiences.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
assets/images/bgs/technologies.jpg
Normal file
After Width: | Height: | Size: 119 KiB |
4
assets/images/extras/Placeholder-Image---Landscape.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="1280" height="720" viewBox="0 0 1280 720" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1280" height="720" fill="#DBDBDB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M740 300C740 288.954 731.046 280 720 280H560C548.954 280 540 288.954 540 300V420C540 431.046 548.954 440 560 440H720C731.046 440 740 431.046 740 420V300ZM615 310C623.284 310 630 316.716 630 325C630 333.284 623.284 340 615 340C606.716 340 600 333.284 600 325C600 316.716 606.716 310 615 310ZM705 410C707.761 410 710 407.762 710 405V401.6C709.993 400.519 709.643 399.469 709 398.6L666.5 341.9C665.533 340.677 664.059 339.964 662.5 339.964C660.941 339.964 659.467 340.677 658.5 341.9L629.7 379.1C628.746 380.347 627.27 381.085 625.7 381.1C624.227 381.102 622.832 380.441 621.9 379.3L607.4 361.8C606.437 360.644 605.005 359.983 603.5 360C602.127 360.144 600.868 360.827 600 361.9L571.1 398.6C570.387 399.437 569.996 400.501 570 401.6V405C570 407.762 572.239 410 575 410H705Z" fill="black" fill-opacity="0.15"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1014 B |
4
assets/images/extras/Placeholder-Video---Landscape.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="1280" height="720" viewBox="0 0 1280 720" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1280" height="720" fill="#DBDBDB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M560 280H720C731.046 280 740 288.954 740 300V420C740 431.046 731.046 440 720 440H560C548.954 440 540 431.046 540 420V300C540 288.954 548.954 280 560 280ZM631.7 392.2L670.6 366.2C672.696 364.834 673.96 362.502 673.96 360C673.96 357.498 672.696 355.166 670.6 353.8L631.7 327.8C629.403 326.248 626.438 326.089 623.988 327.387C621.539 328.685 620.005 331.228 620 334V386C620.005 388.772 621.539 391.315 623.988 392.613C626.438 393.911 629.403 393.752 631.7 392.2Z" fill="black" fill-opacity="0.15"/>
|
||||
</svg>
|
After Width: | Height: | Size: 703 B |
6
assets/images/extras/company-logo.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg width="63" height="27" viewBox="0 0 63 27" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0.564453 21H13.2485V17.444H5.10045V0.980011H0.564453V21Z" fill="white"/>
|
||||
<path d="M21.587 18.228C19.291 18.228 18.003 16.548 18.003 13.748V13.524C18.003 10.724 19.347 9.10001 21.587 9.10001C23.855 9.10001 25.171 10.78 25.171 13.58V13.776C25.171 16.548 23.855 18.228 21.587 18.228ZM21.559 21.308C25.955 21.308 29.287 18.368 29.287 13.748V13.524C29.287 8.96001 25.983 6.02001 21.587 6.02001C17.191 6.02001 13.859 9.01601 13.859 13.608V13.832C13.859 18.396 17.191 21.308 21.559 21.308Z" fill="white"/>
|
||||
<path d="M37.6649 26.404C42.4809 26.404 45.3649 24.192 45.3929 19.852V6.35601H41.3609V8.54001C40.5209 7.05601 39.0929 6.02001 36.7129 6.02001C33.0729 6.02001 30.2729 8.96001 30.2729 13.16V13.356C30.2729 17.696 33.1009 20.356 36.6569 20.356C38.8129 20.356 40.5489 19.068 41.3609 17.64V19.852C41.3609 22.148 40.1289 23.436 37.6649 23.436C35.5929 23.436 34.6689 22.596 34.4169 21.308H30.3849C30.7769 24.332 32.9329 26.404 37.6649 26.404ZM37.8609 17.304C35.8449 17.304 34.4169 15.792 34.4169 13.356V13.132C34.4169 10.724 35.6769 9.10001 37.9449 9.10001C40.1569 9.10001 41.4729 10.612 41.4729 13.104V13.3C41.4729 15.792 39.9889 17.304 37.8609 17.304Z" fill="white"/>
|
||||
<path d="M54.9617 18.228C52.6657 18.228 51.3777 16.548 51.3777 13.748V13.524C51.3777 10.724 52.7217 9.10001 54.9617 9.10001C57.2297 9.10001 58.5457 10.78 58.5457 13.58V13.776C58.5457 16.548 57.2297 18.228 54.9617 18.228ZM54.9337 21.308C59.3297 21.308 62.6617 18.368 62.6617 13.748V13.524C62.6617 8.96001 59.3577 6.02001 54.9617 6.02001C50.5657 6.02001 47.2337 9.01601 47.2337 13.608V13.832C47.2337 18.396 50.5657 21.308 54.9337 21.308Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
4
assets/images/extras/image.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="300" height="300" fill="#E0E0E0"/>
|
||||
<path d="M174 168.75V132C174 129.112 171.638 126.75 168.75 126.75H132C129.112 126.75 126.75 129.112 126.75 132V168.75C126.75 171.638 129.112 174 132 174H168.75C171.638 174 174 171.638 174 168.75ZM141.188 154.312L147.75 162.214L156.938 150.375L168.75 166.125H132L141.188 154.312Z" fill="#C2C2C2"/>
|
||||
</svg>
|
After Width: | Height: | Size: 452 B |
BIN
assets/images/extras/placeholder-account-image.png
Normal file
After Width: | Height: | Size: 24 KiB |
4
assets/images/extras/placeholder-image.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1000" height="1000" fill="#DBDBDB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M600 440C600 428.954 591.046 420 580 420H420C408.954 420 400 428.954 400 440V560C400 571.046 408.954 580 420 580H580C591.046 580 600 571.046 600 560V440ZM475 450C483.284 450 490 456.716 490 465C490 473.284 483.284 480 475 480C466.716 480 460 473.284 460 465C460 456.716 466.716 450 475 450ZM565 550C567.761 550 570 547.762 570 545V541.6C569.993 540.519 569.643 539.469 569 538.6L526.5 481.9C525.533 480.677 524.059 479.964 522.5 479.964C520.941 479.964 519.467 480.677 518.5 481.9L489.7 519.1C488.746 520.347 487.27 521.085 485.7 521.1C484.227 521.102 482.832 520.441 481.9 519.3L467.4 501.8C466.437 500.644 465.005 499.983 463.5 500C462.127 500.144 460.868 500.827 460 501.9L431.1 538.6C430.387 539.437 429.996 540.501 430 541.6V545C430 547.762 432.239 550 435 550H565Z" fill="black" fill-opacity="0.15"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1017 B |
4
assets/images/extras/placeholder-video-thumbnail.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="1000" height="1000" fill="#DBDBDB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M420 420H580C591.046 420 600 428.954 600 440V560C600 571.046 591.046 580 580 580H420C408.954 580 400 571.046 400 560V440C400 428.954 408.954 420 420 420ZM491.7 532.2L530.6 506.2C532.696 504.834 533.96 502.502 533.96 500C533.96 497.498 532.696 495.166 530.6 493.8L491.7 467.8C489.403 466.248 486.438 466.089 483.988 467.387C481.539 468.685 480.005 471.228 480 474V526C480.005 528.772 481.539 531.315 483.988 532.613C486.438 533.911 489.403 533.752 491.7 532.2Z" fill="black" fill-opacity="0.15"/>
|
||||
</svg>
|
After Width: | Height: | Size: 706 B |
5
assets/images/logos/harplabs-icon.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="46" height="55" viewBox="0 0 46 55" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 0L45.5054 54.5936L45.6805 54.3836V47.4566L6.12396 0H0Z" fill="#D7B331"/>
|
||||
<path d="M15.9182 0L45.5055 35.4965L45.6807 35.2863V28.3597L22.0421 0H15.9182Z" fill="#E3AD3F"/>
|
||||
<path d="M31.6883 0L45.5052 16.5764L45.6803 16.3665V9.4395L37.8124 0H31.6883Z" fill="#987F68"/>
|
||||
</svg>
|
After Width: | Height: | Size: 381 B |
BIN
assets/images/logos/harplabs-login-logo.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
7
assets/images/logos/harplabs-login-logo.svg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
assets/images/logos/harplabs-logo-dark.png
Normal file
After Width: | Height: | Size: 9.4 KiB |
6
assets/images/logos/harplabs-logo-dark.svg
Normal file
After Width: | Height: | Size: 11 KiB |
6
assets/images/logos/harplabs-logo-white.svg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
assets/images/logos/partners.zip
Normal file
BIN
assets/images/logos/partners/aac.png
Normal file
After Width: | Height: | Size: 12 KiB |
1
assets/images/logos/partners/aac.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1481 515'></svg>
|
After Width: | Height: | Size: 69 B |
BIN
assets/images/logos/partners/crane.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
assets/images/logos/partners/cranegr.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
assets/images/logos/partners/cranets.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
27
assets/images/logos/partners/destinationm.svg
Normal file
@@ -0,0 +1,27 @@
|
||||
<svg width="200" height="100" viewBox="0 0 200 100" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g clip-path="url(#clip0_122_103)">
|
||||
<path d="M205.887 -5.94415H-34.0132V270.453H205.887V-5.94415Z" fill="white"/>
|
||||
<path d="M166.356 33.9569H4.63531C3.91931 33.9569 3.33643 33.3748 3.33643 32.6596C3.33643 31.9444 3.91931 31.3623 4.63531 31.3623H166.372C167.089 31.3623 167.672 31.9444 167.672 32.6596C167.655 33.3748 167.072 33.9569 166.356 33.9569Z" fill="#B2A77E"/>
|
||||
<path d="M9.61405 57.9408H10.8796C12.4282 57.9408 13.011 57.1758 13.011 55.5292V46.2649C13.011 44.7513 12.4948 43.8866 10.8796 43.8866H9.61405V57.9408ZM6.84985 41.3085H10.9461C14.06 41.3085 15.7751 43.1713 15.7751 46.2815V55.2797C15.7751 58.839 13.9435 60.5355 10.6963 60.5355H6.86658V41.3085H6.84985Z" fill="#373A36"/>
|
||||
<path d="M23.7681 41.3085H31.9939V43.9031H26.5321V49.5415H31.2945V52.1362H26.5321V57.7746H31.9939V60.5188H23.7681V41.3085Z" fill="#373A36"/>
|
||||
<path d="M48.0959 46.8305H45.3317V46.215C45.3317 44.951 44.7989 43.8866 43.3835 43.8866C41.8682 43.8866 41.5185 45.1006 41.5185 46.3647C41.5185 47.8451 41.6518 48.3606 43.0838 48.9262L45.1819 49.7578C47.613 50.6725 48.0792 52.2194 48.0792 55.0136C48.0792 58.2569 46.897 60.652 43.3168 60.652C40.636 60.652 38.6211 58.6893 38.6211 56.0947V55.0968H41.3853V55.9617C41.3853 56.9596 41.9347 57.9242 43.3336 57.9242C45.1985 57.9242 45.3317 56.8099 45.3317 55.0635C45.3317 53.0176 45.0819 52.685 43.7332 52.1527L41.7683 51.3378C39.3871 50.3564 38.7709 48.793 38.7709 46.3979C38.7709 43.4873 40.3362 41.1422 43.5001 41.1422C46.2642 41.1422 48.0959 43.3543 48.0959 45.4832V46.8305Z" fill="#373A36"/>
|
||||
<path d="M57.3709 43.9031H54.1738V41.3085H63.3157V43.9031H60.1185V60.5188H57.3709V43.9031Z" fill="#373A36"/>
|
||||
<path d="M72.7738 41.3085H70.0098V60.5355H72.7738V41.3085Z" fill="#373A36"/>
|
||||
<path d="M80.75 41.3085H83.3977L87.5606 52.8846H87.6105V41.3085H90.3746V60.5188H87.777L83.5641 48.976H83.4976V60.5188H80.75V41.3085Z" fill="#373A36"/>
|
||||
<path d="M102.48 46.8305H102.43L101.081 53.7994H103.846L102.48 46.8305ZM101.314 41.3085H103.613L107.909 60.5355H105.162L104.345 56.4106H100.582L99.7659 60.5355H97.0017L101.314 41.3085Z" fill="#373A36"/>
|
||||
<path d="M114.986 43.9031H111.805V41.3085H120.931V43.9031H117.751V60.5188H114.986V43.9031Z" fill="#373A36"/>
|
||||
<path d="M130.405 41.3085H127.641V60.5355H130.405V41.3085Z" fill="#373A36"/>
|
||||
<path d="M141.062 55.9949C141.062 57.3088 141.928 57.9409 142.928 57.9409C143.926 57.9409 144.792 57.3255 144.792 55.9949V45.8491C144.792 44.5351 143.926 43.9031 142.928 43.9031C141.928 43.9031 141.062 44.5186 141.062 45.8491V55.9949ZM138.315 45.8326C138.315 42.7056 140.696 41.1422 142.928 41.1422C145.174 41.1422 147.556 42.7056 147.556 45.8326V55.9782C147.556 59.1051 145.174 60.6686 142.928 60.6686C140.679 60.6686 138.315 59.1051 138.315 55.9782V45.8326Z" fill="#373A36"/>
|
||||
<path d="M155.283 41.3085H157.93L162.093 52.8846H162.143V41.3085H164.908V60.5188H162.31L158.096 48.976H158.047V60.5188H155.283V41.3085Z" fill="#373A36"/>
|
||||
</g>
|
||||
<rect x="173.176" y="37.807" width="23.8246" height="23.8246" fill="url(#pattern0)"/>
|
||||
<defs>
|
||||
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||
<use xlink:href="#image0_122_103" transform="scale(0.0238095)"/>
|
||||
</pattern>
|
||||
<clipPath id="clip0_122_103">
|
||||
<rect width="164.503" height="37.4386" fill="white" transform="translate(3 31)"/>
|
||||
</clipPath>
|
||||
<image id="image0_122_103" width="42" height="42" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAEJElEQVRYhe2Zz2siZxjHP25j8AckBoNMiC6OCzOGetBDiRYKSW+9bY+99S/pv7P3XtpbAj0YeqgDtawj1FcyhsgQiRswkYy0PczMG5NNdNRJt9A8twRn8uGZ532+nzGRH9/98Df/8frsr1eVV58aImi9gIZdH4Equ0U2UgoA0fUYBb36rADpTJ6cWgZgc0shp1Ye/dxHoAW9xhdffQdAIpni88o3bGfUZwOt7H9L2ru/qtUo778NBuoDpjN5Plz2GdhdtNLBs0Dm1DLxZAqzeUQimZKdDQwKoHtw7eYx6UyezS3lGUArWMLgZjRE1WozP/so6MDuks6opDN5LmzB1bA/90aLVjqTJ53JY4kG0fUYObWM44wXBx3YXTnYHfOEnFomkUyFBlrQa/LvKLt7EAGrYywGCmCJhpwhSzS4GQ3RSoehQMaTKZTdIh2zDoBWOqDfay3eURfUnR3dgzObx+TUMtH12MqgeumQm9GQ/lkLJbtHIpmi3Tyaec3MhW82j1CyRdaiMdnVVWd1LerOo+mBFbQq/bMW16Ph8qCWMIgAb3QX7lQYFLTqSl19o9eYOGMsYcg1KMyTudfNjdCOeYKqV1mLxhDtOkRYuqtr0RiqXqXjgWneCFzYYnXQP806EWAnW8S5HcsNsEztZItEvHv6K8lsHge6di7oxBlzKgx54kW77qXI45k8q/TSIee9FhNnjKrVcJwxlmiEAwrQMesy4pxbd74WjdXpuPR/7gSYzYVAb0ZDLGFQ8GazLbM5eFen4zKnVkgkU/QCdjMwKLhd3dhSSGfyXHvgqhZMAafj0oUuYwlj7koKDKrsFvny6+8BuBq6JuXLimjX2dxSAingdFxuew7RE25cFrSq1MqlQTe3dqQrghsA6YzKRkoJrIB+XPqzmVXLDOyuXEnR9TjR6Py9vNCryMDucjXsU9D9WXUVcFZX/bgc2F15IC3xtHyEAgrurPon+MIWDOwu2Sf2atwDu+tmxTuYwQ/R0qAPZcUSxpMK+FqCGe77l1bldIluLgUKj8vKQwX049J/zL5zinb93wM977XuyYqvgNNdfa2WZVzClHPePu2coYNOnLGUFUB2NTsVAEp2j1NhMHHGbGfUQM4ZOijcyYovKJ32yT0FbP72E+bvLphWOmBgdxda8KGBTpwx572WnE1LNO4p4NWwz8QZS+dsB7Sk0EGBe+/jvgIWHsTqIs75bKD+6vEfvy/WvqxE12NeKq3WzZVBwX3k/ncAzu2Yfq8lYzWnViAC/bP3nx7Ul427b1buFFDVqlgdY+mVFCoo3MlKPJmSCljef0simVp6wT+sUEAHdvderPr7clHnnFVrD3/RMevy5qeiwfXoMtCNfv3lnUym69GQPxo/Mwhw0s977/lweQ5AzwuOxyry8s+GkOsF9H9b/wC4EhJ3PAeaMgAAAABJRU5ErkJggg=="/>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
21
assets/images/logos/partners/destinationm1.svg
Normal file
@@ -0,0 +1,21 @@
|
||||
<svg width="175" height="202" viewBox="0 0 175 202" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M175 0H0V202H175V0Z" fill="white"/>
|
||||
<path d="M147.208 54.5174H27.0754V174.735H147.208V54.5174Z" fill="#B2A77E"/>
|
||||
<path d="M146.163 29.161H28.1929C27.6706 29.161 27.2454 28.7356 27.2454 28.2129C27.2454 27.6902 27.6706 27.2648 28.1929 27.2648H146.175C146.698 27.2648 147.123 27.6902 147.123 28.2129C147.111 28.7356 146.686 29.161 146.163 29.161Z" fill="#B2A77E"/>
|
||||
<path d="M31.8248 46.6892H32.748C33.8776 46.6892 34.3028 46.1301 34.3028 44.9267V38.1561C34.3028 37.0499 33.9262 36.4179 32.748 36.4179H31.8248V46.6892ZM29.8084 34.5338H32.7965C35.068 34.5338 36.3191 35.8952 36.3191 38.1682V44.7444C36.3191 47.3456 34.983 48.5855 32.6143 48.5855H29.8206V34.5338H29.8084Z" fill="#373A36"/>
|
||||
<path d="M42.1497 34.5338H48.1502V36.43H44.166V40.5507H47.64V42.447H44.166V46.5677H48.1502V48.5733H42.1497V34.5338Z" fill="#373A36"/>
|
||||
<path d="M59.8962 38.5694H57.8798V38.1196C57.8798 37.1958 57.4911 36.4179 56.4586 36.4179C55.3533 36.4179 55.0982 37.3052 55.0982 38.229C55.0982 39.3109 55.1954 39.6877 56.24 40.101L57.7705 40.7088C59.5439 41.3773 59.884 42.5078 59.884 44.5499C59.884 46.9202 59.0216 48.6706 56.41 48.6706C54.4544 48.6706 52.9846 47.2362 52.9846 45.34V44.6107H55.001V45.2428C55.001 45.9721 55.4018 46.6771 56.4222 46.6771C57.7826 46.6771 57.8798 45.8627 57.8798 44.5864C57.8798 43.0912 57.6976 42.8481 56.7137 42.4591L55.2804 41.8635C53.5434 41.1463 53.0939 40.0037 53.0939 38.2533C53.0939 36.1261 54.2357 34.4122 56.5437 34.4122C58.56 34.4122 59.8962 36.0289 59.8962 37.5848V38.5694Z" fill="#373A36"/>
|
||||
<path d="M66.662 36.43H64.3298V34.5338H70.9985V36.43H68.6663V48.5733H66.662V36.43Z" fill="#373A36"/>
|
||||
<path d="M77.8978 34.5338H75.8815V48.5855H77.8978V34.5338Z" fill="#373A36"/>
|
||||
<path d="M83.7162 34.5338H85.6476L88.6843 42.994H88.7207V34.5338H90.7371V48.5733H88.8422L85.769 40.1374H85.7205V48.5733H83.7162V34.5338Z" fill="#373A36"/>
|
||||
<path d="M99.5679 38.5694H99.5315L98.5476 43.6625H100.564L99.5679 38.5694ZM98.7176 34.5338H100.394L103.528 48.5855H101.524L100.928 45.5709H98.1832L97.588 48.5855H95.5716L98.7176 34.5338Z" fill="#373A36"/>
|
||||
<path d="M108.69 36.43H106.37V34.5338H113.027V36.43H110.707V48.5733H108.69V36.43Z" fill="#373A36"/>
|
||||
<path d="M119.938 34.5338H117.922V48.5855H119.938V34.5338Z" fill="#373A36"/>
|
||||
<path d="M127.712 45.2671C127.712 46.2273 128.344 46.6893 129.073 46.6893C129.801 46.6893 130.433 46.2395 130.433 45.2671V37.8522C130.433 36.8919 129.801 36.43 129.073 36.43C128.344 36.43 127.712 36.8798 127.712 37.8522V45.2671ZM125.708 37.8401C125.708 35.5548 127.445 34.4122 129.073 34.4122C130.712 34.4122 132.449 35.5548 132.449 37.8401V45.2549C132.449 47.5401 130.712 48.6828 129.073 48.6828C127.433 48.6828 125.708 47.5401 125.708 45.2549V37.8401Z" fill="#373A36"/>
|
||||
<path d="M138.086 34.5338H140.017L143.054 42.994H143.09V34.5338H145.107V48.5733H143.212L140.138 40.1374H140.102V48.5733H138.086V34.5338Z" fill="#373A36"/>
|
||||
<path d="M41.3601 161.619C40.2912 161.619 39.4288 160.756 39.4288 159.687V69.2985C39.4288 68.3868 40.0604 67.6089 40.9471 67.4144C41.846 67.2199 42.7327 67.6697 43.1093 68.4962L84.5423 158.86C84.9917 159.833 84.5666 160.975 83.5948 161.425C82.6231 161.875 81.4812 161.437 81.0318 160.477L43.2915 78.1355V159.687C43.2915 160.756 42.429 161.619 41.3601 161.619Z" fill="white"/>
|
||||
<path d="M51.0654 161.632C49.9965 161.632 49.1341 160.769 49.1341 159.699V114.991C49.1341 113.921 49.9965 113.058 51.0654 113.058C52.1344 113.058 52.9968 113.921 52.9968 114.991V159.699C52.9968 160.769 52.1344 161.632 51.0654 161.632Z" fill="white"/>
|
||||
<path d="M123.728 161.717C122.659 161.717 121.797 160.854 121.797 159.784V114.906C121.797 113.836 122.659 112.973 123.728 112.973C124.797 112.973 125.659 113.836 125.659 114.906V159.784C125.659 160.842 124.785 161.717 123.728 161.717Z" fill="white"/>
|
||||
<path d="M132.802 161.68C131.733 161.68 130.87 160.817 130.87 159.747V78.5123L95.2315 160.513C94.9278 161.206 94.2476 161.668 93.4945 161.668C93.4823 161.668 93.4702 161.668 93.4702 161.668C92.7171 161.668 92.0369 161.23 91.721 160.55L49.62 70.1615C49.1705 69.2012 49.5835 68.0464 50.5553 67.5967C51.5149 67.1469 52.6688 67.5724 53.1183 68.5327L93.4095 155.055L131.04 68.4719C131.405 67.6332 132.304 67.1713 133.203 67.3536C134.101 67.5359 134.745 68.326 134.745 69.2498V159.772C134.733 160.817 133.871 161.68 132.802 161.68Z" fill="white"/>
|
||||
<path d="M93.4824 137.418C93.2151 137.418 92.9479 137.357 92.6807 137.248C91.7089 136.81 91.2838 135.667 91.7211 134.695L121.785 68.4354C122.222 67.463 123.364 67.0376 124.348 67.4751C125.319 67.9127 125.744 69.0554 125.307 70.0278L95.2437 136.287C94.9157 136.992 94.2112 137.418 93.4824 137.418Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 4.6 KiB |
8
assets/images/logos/partners/destinationm2.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg width="42" height="42" viewBox="0 0 42 42" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M41.1883 0H0V41.0645H41.1883V0Z" fill="#B2A77E"/>
|
||||
<path d="M4.89762 36.5844C4.53113 36.5844 4.23544 36.2896 4.23544 35.9242V5.04897C4.23544 4.73756 4.452 4.47182 4.75602 4.40539C5.06421 4.33895 5.36823 4.49258 5.49733 4.77493L19.7029 35.6418C19.857 35.974 19.7112 36.3643 19.3781 36.5179C19.0449 36.6716 18.6534 36.5221 18.4993 36.1941L5.5598 8.06756V35.9242C5.5598 36.2896 5.26411 36.5844 4.89762 36.5844Z" fill="white"/>
|
||||
<path d="M8.22517 36.5885C7.85868 36.5885 7.56299 36.2937 7.56299 35.9283V20.6568C7.56299 20.2914 7.85868 19.9966 8.22517 19.9966C8.59166 19.9966 8.88735 20.2914 8.88735 20.6568V35.9283C8.88735 36.2937 8.59166 36.5885 8.22517 36.5885Z" fill="white"/>
|
||||
<path d="M33.1381 36.6176C32.7716 36.6176 32.4759 36.3228 32.4759 35.9574V20.6278C32.4759 20.2624 32.7716 19.9676 33.1381 19.9676C33.5045 19.9676 33.8002 20.2624 33.8002 20.6278V35.9574C33.8002 36.3187 33.5004 36.6176 33.1381 36.6176Z" fill="white"/>
|
||||
<path d="M36.249 36.6051C35.8826 36.6051 35.5869 36.3103 35.5869 35.9449V8.19629L23.3678 36.2065C23.2637 36.4432 23.0305 36.601 22.7723 36.601C22.7681 36.601 22.7639 36.601 22.7639 36.601C22.5057 36.601 22.2725 36.4515 22.1642 36.219L7.72957 5.34379C7.57547 5.01577 7.71707 4.62132 8.05024 4.46769C8.37925 4.31406 8.77489 4.45938 8.92898 4.7874L22.7431 34.3422L35.6452 4.76664C35.7701 4.48015 36.0783 4.32236 36.3865 4.38465C36.6947 4.44693 36.9154 4.71682 36.9154 5.03238V35.9532C36.9112 36.3103 36.6155 36.6051 36.249 36.6051Z" fill="white"/>
|
||||
<path d="M22.7681 28.3175C22.6765 28.3175 22.5848 28.2967 22.4932 28.2593C22.1601 28.1099 22.0143 27.7196 22.1642 27.3874L32.4717 4.75419C32.6216 4.42202 33.0131 4.27669 33.3505 4.42617C33.6836 4.57565 33.8294 4.96595 33.6795 5.29812L23.372 27.9313C23.2595 28.1722 23.018 28.3175 22.7681 28.3175Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
BIN
assets/images/logos/partners/destinationmloader.gif
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
assets/images/logos/partners/dogs-reformed1.png
Normal file
After Width: | Height: | Size: 147 KiB |
BIN
assets/images/logos/partners/dogs-reformed2.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
assets/images/logos/partners/harpLabs Inc..zip
Normal file
BIN
assets/images/logos/partners/lotw1.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
assets/images/logos/partners/lotw2.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
assets/images/logos/partners/m2v.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
assets/images/logos/partners/nan.png
Normal file
After Width: | Height: | Size: 16 KiB |
9
assets/images/logos/partners/nan.svg
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
assets/images/logos/partners/ptd.png
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
assets/images/logos/partners/quaenet.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
assets/images/logos/partners/rm.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
assets/images/logos/partners/romag.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
assets/images/logos/partners/trio1.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
assets/images/logos/partners/trio2.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
assets/images/logos/partners/turris.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
486
assets/js/index.js
Normal file
@@ -0,0 +1,486 @@
|
||||
/******/ (() => { // webpackBootstrap
|
||||
/******/ var __webpack_modules__ = ({
|
||||
|
||||
/***/ "./src/scripts/CollapsePanel.js":
|
||||
/*!**************************************!*\
|
||||
!*** ./src/scripts/CollapsePanel.js ***!
|
||||
\**************************************/
|
||||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
||||
/* harmony export */ });
|
||||
class CollapsePanel {
|
||||
constructor() {
|
||||
this.init();
|
||||
}
|
||||
init() {
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
this.addToggleCollapseListener('.accordion-toggle');
|
||||
});
|
||||
}
|
||||
addToggleCollapseListener(selector) {
|
||||
this.toggles = document.querySelectorAll(selector);
|
||||
this.toggles.forEach(toggle => {
|
||||
toggle.addEventListener('click', () => {
|
||||
toggle.parentNode.parentNode.classList.toggle('active');
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CollapsePanel);
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./src/scripts/ContactTabs.js":
|
||||
/*!************************************!*\
|
||||
!*** ./src/scripts/ContactTabs.js ***!
|
||||
\************************************/
|
||||
/***/ (() => {
|
||||
|
||||
class ContactTabs {
|
||||
constructor() {
|
||||
this.tabLinks = document.querySelectorAll('.tab-link');
|
||||
this.tabs = document.querySelectorAll('.tab');
|
||||
this.selectTab = document.getElementById('tabs');
|
||||
this.contactTabs = document.getElementById('contact-tabs');
|
||||
if (!this.contactTabs) {
|
||||
console.error("Element with id 'contact-tabs' not found.");
|
||||
return;
|
||||
}
|
||||
this.initializeTabs();
|
||||
this.syncTabsWithSelect();
|
||||
this.syncSelectWithTabs();
|
||||
this.handleHashNavigation(); // Call handleHashNavigation on initialization
|
||||
this.handleFormSubmission(); // Handle form submission on initialization
|
||||
}
|
||||
initializeTabs() {
|
||||
// Hide all tab contents except the first one
|
||||
this.tabs.forEach((tab, index) => {
|
||||
if (index !== 0) {
|
||||
tab.style.display = 'none';
|
||||
}
|
||||
});
|
||||
|
||||
// Activate the first tab link by default
|
||||
this.tabLinks[0].classList.add('bg-blue-100');
|
||||
this.tabLinks.forEach(tabLink => {
|
||||
tabLink.addEventListener('click', this.handleTabLinkClick.bind(this));
|
||||
});
|
||||
}
|
||||
handleTabLinkClick(event) {
|
||||
// event.preventDefault(); // Prevent scrolling to the hash position
|
||||
const tabLink = event.currentTarget;
|
||||
const tabName = tabLink.getAttribute('data-tab');
|
||||
|
||||
// Store the last opened tab in session storage
|
||||
sessionStorage.setItem('lastTab', tabName);
|
||||
|
||||
// Update the hash
|
||||
this.updateHash(tabName);
|
||||
|
||||
// Show the clicked tab
|
||||
this.showTab(tabName);
|
||||
}
|
||||
showTab(tabName) {
|
||||
// Hide all tabs
|
||||
this.tabs.forEach(tab => {
|
||||
tab.style.display = 'none';
|
||||
});
|
||||
|
||||
// Deactivate all tab links
|
||||
this.tabLinks.forEach(link => {
|
||||
link.classList.remove('bg-blue-100');
|
||||
});
|
||||
|
||||
// Show the selected tab
|
||||
document.getElementById(tabName).style.display = 'block';
|
||||
|
||||
// Activate the clicked tab link
|
||||
const tabLink = document.querySelector(`[data-tab="${tabName}"]`);
|
||||
if (tabLink) {
|
||||
tabLink.classList.add('bg-blue-100');
|
||||
}
|
||||
|
||||
// Update the select dropdown
|
||||
if (this.selectTab) {
|
||||
this.selectTab.value = tabName;
|
||||
}
|
||||
}
|
||||
syncTabsWithSelect() {
|
||||
if (!this.selectTab) return;
|
||||
this.selectTab.addEventListener('change', event => {
|
||||
const selectedTabName = event.target.value;
|
||||
|
||||
// Store the last opened tab in session storage
|
||||
sessionStorage.setItem('lastTab', selectedTabName);
|
||||
|
||||
// Update the hash
|
||||
this.updateHash(selectedTabName);
|
||||
this.showTab(selectedTabName);
|
||||
});
|
||||
}
|
||||
syncSelectWithTabs() {
|
||||
if (!this.tabLinks) return;
|
||||
this.tabLinks.forEach(tabLink => {
|
||||
tabLink.addEventListener('click', event => {
|
||||
const tabName = tabLink.getAttribute('data-tab');
|
||||
|
||||
// Store the last opened tab in session storage
|
||||
sessionStorage.setItem('lastTab', tabName);
|
||||
|
||||
// Update the hash
|
||||
this.updateHash(tabName);
|
||||
this.selectTab.value = tabName;
|
||||
});
|
||||
});
|
||||
}
|
||||
handleHashNavigation() {
|
||||
const lastTab = sessionStorage.getItem('lastTab');
|
||||
const hash = window.location.hash.substring(1);
|
||||
if (hash) {
|
||||
// If there's a hash in the URL, attempt to show the corresponding tab
|
||||
this.showTab(hash);
|
||||
// Store the last opened tab in session storage
|
||||
sessionStorage.setItem('lastTab', hash);
|
||||
} else if (lastTab) {
|
||||
// If there's a stored tab, show that tab
|
||||
this.showTab(lastTab);
|
||||
} else {
|
||||
// If there's neither a stored tab nor a hash, default to showing the first tab
|
||||
this.showTab(this.tabLinks[0].dataset.tab);
|
||||
}
|
||||
}
|
||||
updateHash(hash) {
|
||||
// Update the hash without causing the page to scroll
|
||||
history.replaceState(null, null, '#' + hash);
|
||||
}
|
||||
handleFormSubmission() {
|
||||
// Check for success or failure notifications in the URL query parameters
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const successMessage = urlParams.get('success');
|
||||
const errorMessage = urlParams.get('error');
|
||||
if (successMessage || errorMessage) {
|
||||
// If success or error notification is present, show the last opened tab
|
||||
const lastTab = sessionStorage.getItem('lastTab');
|
||||
if (lastTab) {
|
||||
this.showTab(lastTab);
|
||||
}
|
||||
// Remove the message from the URL
|
||||
history.replaceState(null, null, window.location.pathname);
|
||||
}
|
||||
}
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
// Check if element with id "contact-tabs" exists
|
||||
const contactTabs = document.getElementById('contact-tabs');
|
||||
if (contactTabs) {
|
||||
const tabs = new ContactTabs();
|
||||
// Handle hash navigation on hash change
|
||||
window.addEventListener('hashchange', () => {
|
||||
tabs.handleHashNavigation();
|
||||
});
|
||||
} else {
|
||||
console.log("Element with id 'contact-tabs' not found.");
|
||||
}
|
||||
});
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./src/scripts/NavControl.js":
|
||||
/*!***********************************!*\
|
||||
!*** ./src/scripts/NavControl.js ***!
|
||||
\***********************************/
|
||||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
||||
/* harmony export */ });
|
||||
class NavControl {
|
||||
constructor() {
|
||||
this.topBanner = document.getElementById('top-banner');
|
||||
this.navbar = document.getElementById('header-nav');
|
||||
this.navbarPadding = document.getElementById('header-padder');
|
||||
this.contentContainer = document.getElementById('content-container');
|
||||
this.toggleMenuBtn = document.getElementById('toggle-nav');
|
||||
this.slideOutMenu = document.getElementById('slide-out-menu');
|
||||
this.accordions = document.querySelectorAll('#slide-out-menu .accordion');
|
||||
this.toggleSearchBtn = document.getElementById('toggle-search');
|
||||
this.headerSearch = document.getElementById('header-search');
|
||||
this.headerSearchOverlay = document.getElementById('search-overlay');
|
||||
this.hoursDropdownToggle = document.getElementById('hours-dropdown-toggle');
|
||||
this.todaysBusinessHoursEl = document.getElementById('todays-business-hours');
|
||||
this.businessHoursMenu = this.hoursDropdownToggle.nextElementSibling;
|
||||
this.init();
|
||||
}
|
||||
init() {
|
||||
// Add event listeners directly, no need to wait for DOMContentLoaded
|
||||
// Add a single click event listener to document for handling link clicks and outside clicks
|
||||
document.addEventListener('click', event => {
|
||||
this.handleLinkAndOutsideClick(event);
|
||||
});
|
||||
window.addEventListener('scroll', this.handleScroll.bind(this));
|
||||
|
||||
// Open and Close the Nav Menu
|
||||
this.toggleMenuBtn.addEventListener('click', () => this.toggleNavMenu());
|
||||
|
||||
// Open and Close the Nav Search
|
||||
this.toggleSearchBtn.addEventListener('click', () => this.toggleSearch());
|
||||
|
||||
// Delegate click event to handle business hours toggle
|
||||
this.hoursDropdownToggle.addEventListener('click', () => {
|
||||
this.businessHoursMenu.classList.toggle('hidden');
|
||||
});
|
||||
document.addEventListener('keyup', e => this.keyPressDispatcher(e));
|
||||
this.businessHours();
|
||||
}
|
||||
headerOutOfView() {
|
||||
this.navbar.classList.add('out-of-view');
|
||||
}
|
||||
headerInView() {
|
||||
setTimeout(() => {
|
||||
this.navbar.classList.add('in-view');
|
||||
}, 100);
|
||||
// setTimeout(() => {
|
||||
// this.navbar.classList.remove('out-of-view');
|
||||
// this.navbar.classList.remove('in-view');
|
||||
// }, 2000);
|
||||
}
|
||||
handleScroll() {
|
||||
var scrollPosition = window.scrollY;
|
||||
if (scrollPosition > 0) {
|
||||
// Change this value to adjust when the navbar becomes fixed
|
||||
this.headerOutOfView();
|
||||
this.headerInView();
|
||||
this.navbarPadding.style.display = 'block';
|
||||
// this.topBanner.classList.remove('open');
|
||||
this.navbar.classList.add('fixed');
|
||||
// this.navbarPadding.classList.add('open');
|
||||
this.topBanner.style.display = 'none';
|
||||
} else {
|
||||
// this.topBanner.classList.add('open');
|
||||
this.topBanner.style.display = 'block';
|
||||
this.navbarPadding.style.display = 'none';
|
||||
this.navbar.classList.remove('in-view', 'out-of-view', 'fixed');
|
||||
// this.navbarPadding.classList.remove('open');
|
||||
setTimeout(() => {
|
||||
this.navbar.classList.remove('in-view');
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
isSearchOpen() {
|
||||
if (this.headerSearch.classList.contains('active')) {
|
||||
return true; // Search is open
|
||||
} else {
|
||||
return false; // Search is not open
|
||||
}
|
||||
}
|
||||
isMenuOpen() {
|
||||
if (this.slideOutMenu.classList.contains('active')) {
|
||||
return true; // Menu is open
|
||||
} else {
|
||||
return false; // Menu is not open
|
||||
}
|
||||
}
|
||||
keyPressDispatcher(e) {
|
||||
console.log('Key pressed: ', e.keyCode); // Add this line
|
||||
if (e.keyCode === 83 && !this.isSearchOpen()) {
|
||||
this.toggleSearch();
|
||||
}
|
||||
if (e.keyCode === 77 && !this.isMenuOpen() && !this.isSearchOpen()) {
|
||||
this.toggleNavMenu();
|
||||
}
|
||||
if (e.keyCode === 27) {
|
||||
if (this.isSearchOpen()) {
|
||||
this.toggleSearch();
|
||||
} else if (this.isMenuOpen()) {
|
||||
this.toggleNavMenu();
|
||||
}
|
||||
}
|
||||
}
|
||||
handleLinkAndOutsideClick(event) {
|
||||
const target = event.target;
|
||||
|
||||
// Handle link clicks
|
||||
const link = target.closest('a');
|
||||
if (link) {
|
||||
if (link.href === window.location.href && this.toggleMenuBtn.classList.contains('active')) {
|
||||
this.toggleNavMenu();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle outside clicks
|
||||
const isOutsideMenu = !this.toggleMenuBtn.contains(target) && !this.slideOutMenu.contains(target) && !this.toggleSearchBtn.contains(target) && !this.headerSearch.contains(target);
|
||||
if (isOutsideMenu) {
|
||||
this.toggleMenuBtn.classList.remove('active');
|
||||
this.slideOutMenu.classList.remove('open');
|
||||
this.removeBodyNoScroll();
|
||||
}
|
||||
const isOutsideBusinessHoursToggle = !this.hoursDropdownToggle.contains(target) && !this.hoursDropdownToggle.classList.contains('hidden');
|
||||
if (isOutsideBusinessHoursToggle) {
|
||||
this.businessHoursMenu.classList.add('hidden');
|
||||
}
|
||||
const isOutsideSearch = !this.toggleSearchBtn.contains(target) && !this.headerSearch.contains(target) && !this.toggleMenuBtn.contains(target) && !this.slideOutMenu.contains(target);
|
||||
if (isOutsideSearch) {
|
||||
this.toggleSearchBtn.classList.remove('active');
|
||||
this.headerSearch.classList.remove('active');
|
||||
this.headerSearchOverlay.classList.remove('active');
|
||||
this.removeBodyNoScroll();
|
||||
}
|
||||
}
|
||||
toggleNavMenu() {
|
||||
if (this.headerSearch.classList.contains('active')) {
|
||||
this.toggleSearch();
|
||||
}
|
||||
this.toggleMenuBtn.classList.toggle('active');
|
||||
this.slideOutMenu.classList.toggle('open');
|
||||
document.body.classList.toggle('noScroll');
|
||||
this.collapseAllAccordions();
|
||||
}
|
||||
toggleSearch() {
|
||||
if (this.toggleMenuBtn.classList.contains('active')) {
|
||||
this.toggleNavMenu();
|
||||
}
|
||||
this.headerSearch.classList.toggle('active');
|
||||
this.headerSearchOverlay.classList.toggle('active');
|
||||
this.headerSearch.querySelector('input').focus();
|
||||
document.body.classList.toggle('noScroll');
|
||||
if (this.headerSearch.classList.contains('active')) {
|
||||
this.headerSearch.querySelector('input').value = '';
|
||||
}
|
||||
}
|
||||
collapseAllAccordions() {
|
||||
this.accordions.forEach(accordion => {
|
||||
accordion.classList.remove('active');
|
||||
});
|
||||
}
|
||||
removeBodyNoScroll() {
|
||||
if (document.body.classList.contains('noScroll')) {
|
||||
document.body.classList.remove('noScroll');
|
||||
}
|
||||
}
|
||||
businessHours() {
|
||||
const dayOfWeek = new Date().getDay();
|
||||
const defaultHours = 'Open Today from 9:00 am - 5:00 pm';
|
||||
let todaysBusinessHours;
|
||||
switch (dayOfWeek) {
|
||||
case 0: // Sunday
|
||||
case 6:
|
||||
// Saturday
|
||||
todaysBusinessHours = `<span class="text-red-500">We are closed today.</span>`;
|
||||
break;
|
||||
default:
|
||||
// Monday to Friday
|
||||
todaysBusinessHours = `<span class="text-green-500">${defaultHours}</span>`;
|
||||
break;
|
||||
}
|
||||
this.todaysBusinessHoursEl.innerHTML = todaysBusinessHours;
|
||||
}
|
||||
}
|
||||
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NavControl);
|
||||
|
||||
/***/ })
|
||||
|
||||
/******/ });
|
||||
/************************************************************************/
|
||||
/******/ // The module cache
|
||||
/******/ var __webpack_module_cache__ = {};
|
||||
/******/
|
||||
/******/ // The require function
|
||||
/******/ function __webpack_require__(moduleId) {
|
||||
/******/ // Check if module is in cache
|
||||
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
||||
/******/ if (cachedModule !== undefined) {
|
||||
/******/ return cachedModule.exports;
|
||||
/******/ }
|
||||
/******/ // Create a new module (and put it into the cache)
|
||||
/******/ var module = __webpack_module_cache__[moduleId] = {
|
||||
/******/ // no module.id needed
|
||||
/******/ // no module.loaded needed
|
||||
/******/ exports: {}
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Execute the module function
|
||||
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
||||
/******/
|
||||
/******/ // Return the exports of the module
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/ /* webpack/runtime/compat get default export */
|
||||
/******/ (() => {
|
||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
/******/ __webpack_require__.n = (module) => {
|
||||
/******/ var getter = module && module.__esModule ?
|
||||
/******/ () => (module['default']) :
|
||||
/******/ () => (module);
|
||||
/******/ __webpack_require__.d(getter, { a: getter });
|
||||
/******/ return getter;
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/define property getters */
|
||||
/******/ (() => {
|
||||
/******/ // define getter functions for harmony exports
|
||||
/******/ __webpack_require__.d = (exports, definition) => {
|
||||
/******/ for(var key in definition) {
|
||||
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
||||
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
||||
/******/ }
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
||||
/******/ (() => {
|
||||
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/make namespace object */
|
||||
/******/ (() => {
|
||||
/******/ // define __esModule on exports
|
||||
/******/ __webpack_require__.r = (exports) => {
|
||||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||
/******/ }
|
||||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/************************************************************************/
|
||||
var __webpack_exports__ = {};
|
||||
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
|
||||
(() => {
|
||||
"use strict";
|
||||
/*!**********************!*\
|
||||
!*** ./src/index.js ***!
|
||||
\**********************/
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _scripts_CollapsePanel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scripts/CollapsePanel */ "./src/scripts/CollapsePanel.js");
|
||||
/* harmony import */ var _scripts_NavControl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./scripts/NavControl */ "./src/scripts/NavControl.js");
|
||||
/* harmony import */ var _scripts_ContactTabs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scripts/ContactTabs */ "./src/scripts/ContactTabs.js");
|
||||
/* harmony import */ var _scripts_ContactTabs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_scripts_ContactTabs__WEBPACK_IMPORTED_MODULE_2__);
|
||||
// import './styles/styles.scss';
|
||||
|
||||
// import React from 'react';
|
||||
// import { createRoot } from 'react-dom/client';
|
||||
|
||||
|
||||
|
||||
// import TestModule from './scripts/TestModule';
|
||||
|
||||
// createRoot(document.querySelector('#root')).render(<ExampleReactComponent />);
|
||||
const collapsePanel = new _scripts_CollapsePanel__WEBPACK_IMPORTED_MODULE_0__["default"]();
|
||||
// const testModule = new TestModule();
|
||||
const navControl = new _scripts_NavControl__WEBPACK_IMPORTED_MODULE_1__["default"]();
|
||||
})();
|
||||
|
||||
/******/ })()
|
||||
;
|
||||
//# sourceMappingURL=index.js.map
|
1
assets/js/index.js.map
Normal file
3962
class-tgm-plugin-activation.php
Normal file
18
footer.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Footer template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
</main>
|
||||
|
||||
<?php get_template_part('template-parts/footer/footer'); ?>
|
||||
|
||||
<?php wp_footer() ?>
|
||||
</body>
|
||||
|
||||
</html>
|
280
front-page.php
Normal file
@@ -0,0 +1,280 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Front Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<!-- Homepage -->
|
||||
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="bg-white">
|
||||
<div class="relative bg-gradient-to-b from-yellow-100/20">
|
||||
<div class="mx-auto max-w-7xl pb-10 pt-10 px-4 2xl:px-0 grid lg:grid-cols-2 gap-8 items-center">
|
||||
|
||||
<div class="lg:pt-4">
|
||||
<div class="mx-auto lg:mx-0 max-w-2xl">
|
||||
<div class="mx-auto lg:mx-0 max-w-lg">
|
||||
<h1 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">Tailored custom software consulting and services.</h1>
|
||||
<p class="mt-6 text-lg leading-8 text-gray-600">Transform your business with premium quality software, end to end support, automation and machine intelligence (AI). </p>
|
||||
|
||||
<div class="mt-10 space-y-2 md:flex md:space-x-2 md:space-y-0">
|
||||
<?php get_template_part('template-parts/partials/book-a-meeting-button') ?>
|
||||
<?php get_template_part('template-parts/partials/get-a-quote-button') ?>
|
||||
</div>
|
||||
|
||||
<ul class="mt-10 grid grid-cols-3 gap-2 lg:gap-8 md:grid-cols-5 text-base leading-7 text-gray-600">
|
||||
<li class="flex space-x-2 font-semibold text-gray-900">
|
||||
<i class="bi bi-pen"></i>
|
||||
<p>Design</p>
|
||||
</li>
|
||||
<li class="flex space-x-2 font-semibold text-gray-900">
|
||||
<i class="bi bi-file-code-fill"></i>
|
||||
<p>Develop</p>
|
||||
</li>
|
||||
<li class="flex space-x-2 font-semibold text-gray-900">
|
||||
<i class="bi bi-check-circle"></i>
|
||||
<p>Test</p>
|
||||
</li>
|
||||
<li class="flex space-x-2 font-semibold text-gray-900">
|
||||
<i class="bi bi-rocket"></i>
|
||||
<p>Launch</p>
|
||||
</li>
|
||||
<li class="flex space-x-2 font-semibold text-gray-900">
|
||||
<i class="bi bi-wrench"></i>
|
||||
<p>Maintain</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full flex items-center justify-center">
|
||||
<img class="" src="<?php echo esc_url(get_template_directory_uri()) . '/assets/images/bgs/system-experiences.png'; ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="absolute inset-x-0 bottom-0 -z-10 h-24 bg-gradient-to-t from-white sm:h-32"></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Client Grid -->
|
||||
<section class="py-12 sm:py-16">
|
||||
<div class="mx-auto px-4 sm:px-6 lg:px-8 ">
|
||||
<?php get_template_part('template-parts/partials/client-grid'); ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<!-- Custom Systems and Applications -->
|
||||
<section id="reliable-software-section">
|
||||
<div class="overflow-hidden py-12 sm:py-16">
|
||||
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div class="mx-auto items-center grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-2">
|
||||
|
||||
|
||||
<div class=" lg:ml-auto lg:pl-4 lg:pt-4">
|
||||
<div class="lg:max-w-lg">
|
||||
<p class="text-3xl font-bold tracking-tight text-white sm:text-4xl">Custom systems and applications you can rely on.</p>
|
||||
<h2 class="mt-4 text-lg font-semibold leading-7 text-stone-300">Even on the go...</h2>
|
||||
<p class="mt-4 text-lg font-medium leading-8 text-stone-200">We strive to provide you with reliable & user-friendly custom software service that delivers exactly what your business needs to take control of your systems. With direct consulting, standard accessible code, and post-launch support, we'll help you grow and accomplish your business objectives.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative lg:order-first p-16 shadow-sm">
|
||||
<img src="<?php echo esc_url(get_template_directory_uri()) . '/assets/images/bgs/7apps.png'; ?>" alt="Device Mockups of 7 Mobile Applications" class="relative rounded-xl shadow-xl z-20">
|
||||
<div class="bg-yellow-300 bg-opacity-10 blur-sm rounded-md inset-0 absolute z-10"></div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<!-- Testimonial -->
|
||||
<?php get_template_part('template-parts/partials/why-us-testimonial'); ?>
|
||||
|
||||
<!-- -->
|
||||
<section>
|
||||
<div class="relative bg-stone-900">
|
||||
<div class="relative h-80 overflow-hidden bg-indigo-600 md:absolute md:left-0 md:h-full md:w-1/3 lg:w-1/2">
|
||||
<img class="h-full w-full object-cover" src="<?php echo esc_url(get_template_directory_uri()) . '/assets/images/bgs/here-to-help.jpg'; ?>" alt="">
|
||||
<svg viewBox="0 0 926 676" aria-hidden="true" class="absolute -bottom-24 left-24 w-[57.875rem] transform-gpu blur-[118px]">
|
||||
<path fill="url(#60c3c621-93e0-4a09-a0e6-4c228a0116d8)" fill-opacity=".4" d="m254.325 516.708-90.89 158.331L0 436.427l254.325 80.281 163.691-285.15c1.048 131.759 36.144 345.144 168.149 144.613C751.171 125.508 707.17-93.823 826.603 41.15c95.546 107.978 104.766 294.048 97.432 373.585L685.481 297.694l16.974 360.474-448.13-141.46Z" />
|
||||
<defs>
|
||||
<linearGradient id="60c3c621-93e0-4a09-a0e6-4c228a0116d8" x1="926.392" x2="-109.635" y1=".176" y2="321.024" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#776FFF" />
|
||||
<stop offset="1" stop-color="#FF4694" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8 lg:py-40">
|
||||
<div class="pl-6 pr-6 md:ml-auto md:w-2/3 md:pl-16 lg:w-1/2 lg:pl-24 lg:pr-0 xl:pl-32">
|
||||
<p class="mt-2 text-3xl font-bold tracking-tight text-white sm:text-4xl">We’re here to help</p>
|
||||
<p class="mt-6 text-base leading-7 text-white">We will invest in drafting specs, creating designs, and delivering quick proof of concept as part of your first project .</p>
|
||||
<p class="mt-6 text-base leading-7 text-white">You can decide if you want to move forward with us to develop the full scope. </p>
|
||||
<div class="mt-8">
|
||||
<a href="<?= get_post_type_archive_link('solutions') ?>" class="w-full text-center rounded-md border border-black bg-stone-100 px-8 py-2.5 text-sm font-semibold shadow-sm hover:bg-stone-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-yellow-600 uppercase">View Solutions</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<!-- Solutions -->
|
||||
<section class="bg-stone-100" id="problem-solution">
|
||||
<div class="py-10">
|
||||
<div class="flex flex-col max-w-7xl mx-auto px-4 relative">
|
||||
|
||||
<div class="text-center text-inherit">
|
||||
<div class="mb-4 text-center text-inherit">
|
||||
<p class="font-bold mb-4 text-3xl text-gray-900 tracking-tight sm:text-4xl"><?php _e('What we offer', 'harplabs'); ?></p>
|
||||
<div class="bg-yellow-300 h-0.5 mx-auto w-28"></div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<h3 class="font-semibold text-2xl text-center lg:text-3xl"><?php _e('A suite of software services...', 'harplabs'); ?></h3>
|
||||
<p class="my-5 text-xl"><?php _e('That provide the peace of mind to focus on growth.', 'harplabs'); ?></p>
|
||||
</div>
|
||||
<div class="gap-4 md:gap-8 grid md:grid-cols-2 lg:grid-cols-4">
|
||||
|
||||
<?php
|
||||
$args = array(
|
||||
'post_type' => 'solutions',
|
||||
'posts_per_page' => -1,
|
||||
'orderby' => 'date',
|
||||
'order' => 'ASC',
|
||||
);
|
||||
$query = new WP_Query($args);
|
||||
if ($query->have_posts()) {
|
||||
while ($query->have_posts()) {
|
||||
$query->the_post();
|
||||
$title = get_the_title() ?>
|
||||
<div class="rounded-l-lg group hover:-translate-y-4 transition-transform duration-300 ease-in-out relative min-w-0 flex-1 overflow-hidden py-4 px-4 text-center text-sm font-medium focus:z-10">
|
||||
|
||||
<a href="<?php the_permalink() ?>">
|
||||
<img src="<?= get_field('solution_image') ?>">
|
||||
<p class="font-medium"><?php _e($title, 'harplabs'); ?></p>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
<?php }
|
||||
wp_reset_postdata();
|
||||
} else {
|
||||
// No posts found
|
||||
}
|
||||
?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Technologies Ticker -->
|
||||
<?php get_template_part('template-parts/partials/technologies-ticker'); ?>
|
||||
|
||||
<!-- From The Blog -->
|
||||
<section>
|
||||
<div class="py-8 md:py-16">
|
||||
<div class="items-center justify-center mb-8 mx-auto relative md:flex md:max-w-2xl lg:max-w-4xl xl:max-w-6xl">
|
||||
<h3 class="font-bold mb-4 text-3xl text-center text-gray-900 tracking-tight sm:text-4xl"><?php _e('From The Blog', 'harplabs'); ?></h3>
|
||||
|
||||
</div>
|
||||
<?php
|
||||
$front_page_blog_args = array(
|
||||
'post_type' => 'post',
|
||||
'posts_per_page' => 4,
|
||||
'paged' => get_query_var('paged') ?: 1,
|
||||
'order' => 'ASC',
|
||||
'orderby' => 'date'
|
||||
)
|
||||
?>
|
||||
<?php $front_page_blog = new WP_Query($front_page_blog_args); ?>
|
||||
<div>
|
||||
<?php if ($front_page_blog->have_posts()) : ?>
|
||||
<div class="gap-2 grid max-w-7xl mx-auto px-4 md:grid-cols-2 lg:grid-cols-4 xl:px-0">
|
||||
<?php $front_page_blog_item_number = 0; ?>
|
||||
<?php while ($front_page_blog->have_posts()) : $front_page_blog->the_post(); ?>
|
||||
<?php if ($front_page_blog_item_number >= 0 && $front_page_blog_item_number <= 3) : ?>
|
||||
<div id="post-<?php the_ID(); ?>" <?php post_class('bg-white flex flex-col justify-between overflow-hidden'); ?>><a href="<?php echo esc_url(get_permalink()); ?>">
|
||||
<img src="<?php the_post_thumbnail_url(get_the_ID()) ?> " alt="">
|
||||
|
||||
</a>
|
||||
<div class="bg-white p-4">
|
||||
<?php $terms = get_the_terms(get_the_ID(), 'category') ?>
|
||||
<?php if (!empty($terms)) : ?>
|
||||
<?php foreach ($terms as $term_i => $term) : ?>
|
||||
<?php if ($term_i == 0) : ?>
|
||||
<p class="font-medium text-sm"><?php echo $term->name; ?></p>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
<a href="<?php echo esc_url(get_permalink()); ?>" class="font-semibold">
|
||||
<p class="font-medium mb-2 text-lg"><?php the_title(); ?></p>
|
||||
</a>
|
||||
<p class="hidden"><?php the_time(get_option('date_format')); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php $front_page_blog_item_number++; ?>
|
||||
<?php endwhile; ?>
|
||||
<?php wp_reset_postdata(); ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="hidden max-w-3xl mt-4 mx-auto px-4 shadow-md w-full sm:col-span-2 md:col-span-4">
|
||||
<div class="bg-yellow-100 px-4 py-5 text-center sm:p-6">
|
||||
<h3 class="text-base font-semibold leading-6">SORRY NO POSTS WERE FOUND</h3>
|
||||
<div class="mt-2">
|
||||
<p>FOLLOW Harplabs FOR UPDATES</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="hidden max-w-3xl mt-4 mx-auto px-4 shadow-md w-full sm:col-span-2 md:col-span-4">
|
||||
<div class="bg-yellow-100 px-4 py-5 text-center sm:p-6">
|
||||
<h3 class="text-base font-semibold leading-6"><?php _e('SORRY NO POSTS WERE FOUND', 'harplabs'); ?></h3>
|
||||
<div class="mt-2">
|
||||
<p><?php _e('FOLLOW Harplabs FOR UPDATES', 'harplabs'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FAQs -->
|
||||
<section id="faqs" class="bg-gray-50 shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 py-8 lg:px-8">
|
||||
<div class="mx-auto max-w-3xl divide-y-2 divide-gray-200">
|
||||
<div class="font-bold my-6 text-4xl text-center sm:text-5xl xl:text-6xl">
|
||||
<h2 class="font-bold mb-4 text-3xl text-gray-900 tracking-tight sm:text-4xl"><?php _e('FAQs', 'harplabs'); ?></h2>
|
||||
</div>
|
||||
|
||||
<?php get_template_part('template-parts/partials/faqs-loop') ?>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
62
functions.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Theme functions.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
// <----- Variables ----->
|
||||
|
||||
// <----- Includes ----->
|
||||
// include(get_theme_file_path('/'));
|
||||
|
||||
// <----- Back End ----->
|
||||
include(get_theme_file_path('/includes/editor_styles_and_scripts.php'));
|
||||
include(get_theme_file_path('/includes/query_adjustments.php'));
|
||||
include(get_theme_file_path('/includes/required_plugins.php'));
|
||||
include(get_theme_file_path('/includes/remove_archive_prefixes.php'));
|
||||
|
||||
// <----- Front End ----->
|
||||
include(get_theme_file_path('/includes/theme_starter_setup.php'));
|
||||
include(get_theme_file_path('/includes/styles_and_scripts.php'));
|
||||
include(get_theme_file_path('/includes/admin_styles_and_scripts.php'));
|
||||
include(get_theme_file_path('/includes/registration_form_message.php'));
|
||||
include(get_theme_file_path('/includes/custom_login_screen.php'));
|
||||
// include(get_theme_file_path('/includes/template_content_update.php'));
|
||||
|
||||
// <----- Hooks ----->
|
||||
|
||||
|
||||
// Theme Starter Features
|
||||
add_action('after_setup_theme', 'themeStarter_setup');
|
||||
|
||||
// Enqueue front-end styles and script
|
||||
add_action('wp_enqueue_scripts', 'themeStarter_enqueue');
|
||||
|
||||
// Enqueue back-end/editor styles and script
|
||||
add_action('after_setup_theme', 'themeStarter_editor_enqueue');
|
||||
|
||||
// Enqueue back-end/editor styles and script
|
||||
add_action('admin_enqueue_scripts', 'themeStarter_admin_enqueue');
|
||||
|
||||
// Hook the function to run when you visit the WordPress admin area
|
||||
// add_action('admin_init', 'update_page_content_from_file');
|
||||
|
||||
// Adjust Queries
|
||||
add_action('pre_get_posts', 'themeStarter_adjust_queries');
|
||||
|
||||
// Change Registration Message
|
||||
add_action('login_message', 'change_reg_message');
|
||||
|
||||
// Customize Login Screen Title
|
||||
add_filter('login_headertitle', 'ourLoginTitle');
|
||||
|
||||
// Change Login Page header url
|
||||
add_filter('login_headerurl', 'ourHeaderUrl');
|
||||
|
||||
// Enqueue out stylesheet for login screen
|
||||
add_action('login_enqueue_scripts', 'ourLoginCSS');
|
||||
|
||||
// Remove Archive Title Prefix
|
||||
add_filter('get_the_archive_title', 'wpdocs_remove_archive_title_prefixes', 10, 2);
|
26
header-landing.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Header template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!doctype html>
|
||||
<html <?php language_attributes(); ?>>
|
||||
|
||||
<head>
|
||||
<meta charset="<?php bloginfo('charset'); ?>" />
|
||||
<meta content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=5, shrink-to-fit=no" name="viewport" />
|
||||
<link href="<?php echo get_template_directory_uri(); ?>/assets/images/logos/harplabs-icon.svg" rel="icon" type="image/png" />
|
||||
<?php wp_head(); ?>
|
||||
</head>
|
||||
|
||||
<body <?php body_class(''); ?>>
|
||||
<?php wp_body_open(); ?>
|
||||
|
||||
<?php get_template_part('template-parts/header/lander-navigation'); ?>
|
||||
|
||||
<main id="content-container">
|
26
header.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Header template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!doctype html>
|
||||
<html <?php language_attributes(); ?>>
|
||||
|
||||
<head>
|
||||
<meta charset="<?php bloginfo('charset'); ?>" />
|
||||
<meta content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=5, shrink-to-fit=no" name="viewport" />
|
||||
<link href="<?php echo get_template_directory_uri(); ?>/assets/images/logos/harplabs-icon.svg" rel="icon" type="image/png" />
|
||||
<?php wp_head(); ?>
|
||||
</head>
|
||||
|
||||
<body <?php body_class(''); ?>>
|
||||
<?php wp_body_open(); ?>
|
||||
|
||||
<?php get_template_part('template-parts/header/default-navigation'); ?>
|
||||
|
||||
<main id="content-container">
|
58
home.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Index template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<!-- Index/Fall Back Template -->
|
||||
<?php get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Single Post/Page Fallback Template -->
|
||||
<section>
|
||||
|
||||
<div class="max-w-7xl grid md:grid-cols-2 lg:grid-cols-4 gap-8 mx-auto px-4 2xl:px-0 py-8">
|
||||
<div class="order-last lg:order-first bg-stone-200 rounded-md">
|
||||
<div class="sticky top-28 p-4 list-none">
|
||||
<?php wp_list_categories(
|
||||
[
|
||||
'title_li' => '<h3 class="font-medium underline mb-2">' . __('Categories', 'ThemeStarter') . '</h3>',
|
||||
]
|
||||
) ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if (have_posts()) : ?>
|
||||
<div class="grid grid-cols-2 lg:grid-cols-3 col-span-3 gap-4">
|
||||
<?php while (have_posts()) : the_post(); ?>
|
||||
<div>
|
||||
<div class="mb-4">
|
||||
<a href="<?php the_permalink() ?>">
|
||||
<img class="rounded-md overflow-hidden" src="<?= get_the_post_thumbnail_url(get_the_ID(), 'full') ?>" alt="Post Featured Image">
|
||||
</div>
|
||||
</a>
|
||||
<h1 class="text-lg font-bold mb-2"><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
|
||||
</div>
|
||||
<?php
|
||||
endwhile;
|
||||
else :
|
||||
_e('Sorry, no posts matched your criteria.', 'textdomain');
|
||||
endif; ?>
|
||||
<div class="text-center font-medium px-6 py-2 col-span-2 lg:col-span-3">
|
||||
<?php posts_nav_link(); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
208
includes/acf_functions.php
Normal file
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
|
||||
//ACF USER MANAGER
|
||||
|
||||
function my_acf_user_form_func($atts, $showForm, $register)
|
||||
{
|
||||
acf_link_to_tab();
|
||||
$a = shortcode_atts(array(
|
||||
'field_group' => ''
|
||||
), $atts);
|
||||
$uid = get_current_user_id();
|
||||
|
||||
if ($register || (!empty($a['field_group']) && !empty($uid))) {
|
||||
$options = array(
|
||||
'post_id' => 'user_' . $uid,
|
||||
'field_groups' => array(intval($a['field_group'])),
|
||||
'updated_message' => $register ? "Profile Registered" : "Profile Updated",
|
||||
//'submit_value' => $register ? "Register" :"Update",
|
||||
/*Choices of 'top' (Above fields) or 'left' (Beside fields) */
|
||||
'label_placement' => 'left',
|
||||
'html_submit_button' => '<div class="et_pb_button_module_wrapper et_pb_button_8_wrapper et_pb_button_alignment_center et_pb_module "><a style="color: #8fbb4a;" class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="javascript:jQuery(\'#acf-form\').submit();">' . ($register ? "Save" : "Update") . '</a></div>',
|
||||
//'<input type="submit" class="acf-button button button-primary button-large" value="%s" />',
|
||||
/* (boolean) Whether or not to create a form element. Useful when a adding to an existing form. Defaults to true */
|
||||
'form' => $showForm,
|
||||
'return' => add_query_arg('updated', 'true', get_permalink())
|
||||
);
|
||||
|
||||
ob_start();
|
||||
|
||||
acf_form($options);
|
||||
$form = ob_get_contents();
|
||||
|
||||
ob_end_clean();
|
||||
}
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
function my_acf_user_form_showProfile($atts)
|
||||
{
|
||||
return my_acf_user_form_func($atts, false, false);
|
||||
}
|
||||
function my_acf_user_form_editProfile($atts)
|
||||
{
|
||||
return my_acf_user_form_func($atts, true, false);
|
||||
}
|
||||
|
||||
function my_acf_user_form_register($atts)
|
||||
{
|
||||
return my_acf_user_form_func($atts, true, true);
|
||||
}
|
||||
|
||||
add_shortcode('my_acf_user_form', 'my_acf_user_form_editProfile');
|
||||
|
||||
add_shortcode('my_acf_user_show_form', 'my_acf_user_form_showProfile');
|
||||
|
||||
add_shortcode('my_acf_user_register_form', 'my_acf_user_form_register');
|
||||
|
||||
//adding AFC form head
|
||||
function add_acf_form_head()
|
||||
{
|
||||
global $post;
|
||||
|
||||
if (!empty($post) && (has_shortcode($post->post_content, 'my_acf_user_form') || has_shortcode($post->post_content, 'my_acf_user_show_form') || has_shortcode($post->post_content, 'my_acf_user_register_form'))) {
|
||||
acf_form_head();
|
||||
}
|
||||
/*if ( !empty($post) && ( has_shortcode( $post->post_content, 'my_acf_user_register_form' )) ) {
|
||||
|
||||
|
||||
//create user first
|
||||
//prepare basic user info
|
||||
$password = wp_generate_password( 10, true, false );
|
||||
$username = $_POST['fields']['field_5dbca1ef8994b'];
|
||||
$email = $_POST['fields']['field_5dbca1ef8994b'];
|
||||
|
||||
//register user
|
||||
$user_id = wp_create_user( $username, $password, $email );
|
||||
|
||||
wp_update_user( array(
|
||||
'ID' => $user_id,
|
||||
'first_name' => $_POST['fields']['field_5dbc8a9f6d904'],
|
||||
'last_name' => $_POST['fields']['field_5dbc8ad36d905'],
|
||||
'display_name' => $_POST['fields']['field_5dbc8a9f6d904'] . ' ' . $_POST['fields']['field_5dbc8ad36d905']
|
||||
) );
|
||||
|
||||
acf_form_head();
|
||||
}*/
|
||||
}
|
||||
add_action('wp_head', 'add_acf_form_head', 7);
|
||||
|
||||
|
||||
// set ACF pre-save stuff
|
||||
add_filter('acf/pre_save_post', 'acf_create_new_user');
|
||||
|
||||
function acf_create_new_user($post_id)
|
||||
{
|
||||
|
||||
global $post;
|
||||
|
||||
if (!empty($post) && (has_shortcode($post->post_content, 'my_acf_user_register_form'))) {
|
||||
error_log('post id: ' . $post_id);
|
||||
|
||||
// // exit if user already logged in, front-end form sent his ID
|
||||
// if ( $post_id != 'new' ) {
|
||||
|
||||
// error_log( 'post not new: ' . $post_id);
|
||||
// // wp_redirect( home_url() );
|
||||
// return $post_id;
|
||||
|
||||
// }
|
||||
|
||||
$field_group = acf_get_fields_by_id('4067');
|
||||
|
||||
//prepare basic user info
|
||||
foreach ($field_group as $key => $value) {
|
||||
//
|
||||
"<br/>+++<br/>" . $value['name'];
|
||||
//echo ":".$_POST['acf'][$value['key']]."<br/>+++<br/>";
|
||||
${$value['name']} = $_POST['acf'][$value['key']];
|
||||
}
|
||||
|
||||
$password = wp_generate_password(10, true, false);
|
||||
$username = $email;
|
||||
$display_name = $first_name . ' ' . $last_name;
|
||||
|
||||
// check if user exists, exit if so
|
||||
if (email_exists($email)) {
|
||||
|
||||
error_log('email exists: ' . $email);
|
||||
wp_redirect(home_url() . '/email-exists?email_exists&user_email=' . $email);
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// register user
|
||||
$user_id = wp_create_user($username, $password, $email);
|
||||
error_log('guy just created: ' . $user_id);
|
||||
|
||||
|
||||
// Fetch the WP_User object of our user.
|
||||
$u = new WP_User($user_id);
|
||||
|
||||
// Replace the current role with 'editor' role
|
||||
$u->set_role($role);
|
||||
|
||||
// update other user info
|
||||
wp_update_user(array(
|
||||
|
||||
'ID' => $user_id,
|
||||
'first_name' => $first_name,
|
||||
'last_name' => $last_name,
|
||||
'display_name' => $display_name
|
||||
|
||||
));
|
||||
|
||||
// update_user_meta( $user_id, '_um_status', 'pending' );
|
||||
|
||||
|
||||
// update other user meta, prevent creation of post data
|
||||
foreach ($field_group as $key => $value) {
|
||||
|
||||
update_user_meta($user_id, $value['name'], $_POST['acf'][$value['key']]);
|
||||
unset($_POST['acf'][$value['key']]);
|
||||
}
|
||||
|
||||
update_user_meta($user_id, 'account_status', 'awaiting_admin_review');
|
||||
//wp_new_user_notification( $user_id, $password);
|
||||
|
||||
// redirect to login page after finish
|
||||
wp_redirect(home_url() . '/registered?new_user=true&user_email=' . $email);
|
||||
exit; //return 'user_' . $user_id;
|
||||
}
|
||||
return $post_id;
|
||||
}
|
||||
|
||||
add_filter('acf/validate_value/name=email', 'my_acf_validate_email', 10, 4);
|
||||
|
||||
function my_acf_validate_email($valid, $value, $field, $input)
|
||||
{
|
||||
|
||||
if (filter_var($value, FILTER_VALIDATE_EMAIL)) {
|
||||
return $valid;
|
||||
} else {
|
||||
$valid = "$value is not a valid email address";
|
||||
}
|
||||
return $valid;
|
||||
}
|
||||
|
||||
|
||||
function acf_link_to_tab()
|
||||
{ ?>
|
||||
<script>
|
||||
(function($) {
|
||||
acf.add_action('ready', function() {
|
||||
if (location.hash.length > 1) {
|
||||
var hash = location.hash.substring(1);
|
||||
$('.acf-tab-wrap .acf-tab-button').each(function(i, button) {
|
||||
if (hash == $(button).text().toLowerCase().replace(' ', '-')) {
|
||||
$(button).trigger('click');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
</script><?php
|
||||
}
|
25
includes/admin_styles_and_scripts.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Admin Styles and Scripts.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
// Enqueue styles and scripts
|
||||
function themeStarter_admin_enqueue()
|
||||
{
|
||||
$theme_version = filemtime(get_stylesheet_directory() . '/style.css');
|
||||
$script_version = filemtime(get_stylesheet_directory() . '/assets/js/index.js');
|
||||
$style_version = filemtime(get_stylesheet_directory() . '/assets/css/styles.css');
|
||||
|
||||
/* Register and Enqueue Scripts */
|
||||
|
||||
wp_register_script('themeStarter-admin-scripts', get_parent_theme_file_uri('/assets/js/index-wp-admin.js'), [], $script_version, true);
|
||||
wp_enqueue_script('themeStarter-admin-scripts');
|
||||
|
||||
/* Register and Enqueue Styles */
|
||||
|
||||
wp_register_style('themeStarter-admin-styles', get_parent_theme_file_uri('/assets/css/styles-wp-admin.css'), [], $style_version, 'all');
|
||||
wp_enqueue_style('themeStarter-admin-styles');
|
||||
}
|
25
includes/custom_login_screen.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Site login.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
// Change Login Page header url
|
||||
function ourHeaderUrl()
|
||||
{
|
||||
return esc_url(site_url('/'));
|
||||
}
|
||||
|
||||
// Make login title the name of our website
|
||||
function ourLoginTitle()
|
||||
{
|
||||
return get_bloginfo('name');
|
||||
}
|
||||
|
||||
// Enqueue out stylesheet for login screen
|
||||
function ourLoginCSS()
|
||||
{
|
||||
wp_enqueue_style('login styles', get_theme_file_uri('/assets/css/styles.css'));
|
||||
}
|
18
includes/editor_styles_and_scripts.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Editor styles and scripts.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
function themeStarter_editor_enqueue()
|
||||
{
|
||||
add_theme_support('editor-styles');
|
||||
|
||||
add_editor_style([
|
||||
'assets/css/styles.css',
|
||||
'assets/css/bootstrap-icons.css',
|
||||
'assets/css/font-awesome.css'
|
||||
]);
|
||||
}
|
78
includes/helper_functions.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Helper functions.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
// Get List of Sub Categories for Slug
|
||||
function getSubpagesForSlug($arrayOfWPPages, $slug)
|
||||
{
|
||||
foreach ($arrayOfWPPages as $page) {
|
||||
if ($page['page']->post_name === $slug) {
|
||||
return $page['subpages'];
|
||||
}
|
||||
}
|
||||
// Return an empty array if the slug is not found
|
||||
return [];
|
||||
}
|
||||
|
||||
// Return WordPress Page For A Slug
|
||||
function getPageForSlug($arrayOfWPPages, $slug)
|
||||
{
|
||||
foreach ($arrayOfWPPages as $page) {
|
||||
if ($page['page']->post_name === $slug) {
|
||||
return $page['page'];
|
||||
}
|
||||
|
||||
foreach ($page['subpages'] as $index => $subpage) {
|
||||
if ($subpage->post_name === $slug) {
|
||||
|
||||
return $page['subpages'][$index];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return an empty array if the slug is not found
|
||||
return [];
|
||||
}
|
||||
|
||||
function ddd($variable)
|
||||
{
|
||||
echo '<pre>';
|
||||
var_dump($variable);
|
||||
echo '<pre>';
|
||||
}
|
||||
|
||||
// Get An Array of Top Level Pages and their Subpages
|
||||
function get_pages_as_array()
|
||||
{
|
||||
|
||||
$args = [
|
||||
'sort_order' => 'ASC',
|
||||
'sort_column' => 'menu_order',
|
||||
'hierarchical' => 1,
|
||||
'exclude' => [237, 238]
|
||||
];
|
||||
|
||||
$pages = get_pages($args);
|
||||
$page_hierarchy = array();
|
||||
|
||||
foreach ($pages as $page) {
|
||||
$parent_id = $page->post_parent;
|
||||
|
||||
// If it's a top-level page
|
||||
if ($parent_id == 0) {
|
||||
$page_hierarchy[$page->ID] = array(
|
||||
'page' => $page,
|
||||
'subpages' => array()
|
||||
);
|
||||
} else {
|
||||
// If it's a child page, add it under its parent
|
||||
$page_hierarchy[$parent_id]['subpages'][] = $page;
|
||||
}
|
||||
}
|
||||
|
||||
return $page_hierarchy;
|
||||
}
|
17
includes/query_adjustments.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Query Adjustments.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
function themeStarter_adjust_queries($query)
|
||||
{
|
||||
|
||||
// Search Page Query Adjustment
|
||||
if ($query->is_search()) {
|
||||
$query->set('posts_per_page', '-1');
|
||||
$query->set('order', 'ASC');
|
||||
}
|
||||
}
|
19
includes/registration_form_message.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Site registration.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
// Change Registration Message
|
||||
function change_reg_message($message)
|
||||
{
|
||||
// change messages that contain 'Register'
|
||||
if (strpos($message, 'Register') !== FALSE) {
|
||||
$newMessage = "Register with " . get_bloginfo('name');
|
||||
return '<p class="message register">' . $newMessage . '</p>';
|
||||
} else {
|
||||
return $message;
|
||||
}
|
||||
}
|
12
includes/remove_archive_prefixes.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Archive Prexix Removal Function.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
function wpdocs_remove_archive_title_prefixes($title, $original_title)
|
||||
{
|
||||
return $original_title;
|
||||
}
|
59
includes/required_plugins.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
// REQUIRED PLUGINS
|
||||
|
||||
require_once get_theme_file_path('/class-tgm-plugin-activation.php');
|
||||
|
||||
add_action('tgmpa_register', 'my_theme_register_required_plugins');
|
||||
|
||||
function my_theme_register_required_plugins()
|
||||
{
|
||||
/*
|
||||
* Array of plugin arrays. Required keys are name and slug.
|
||||
* If the source is NOT from the .org repo, then source is also required.
|
||||
*/
|
||||
$plugins = [
|
||||
[
|
||||
'name' => 'The SEO Framework: Fast, Automated, Effortless',
|
||||
'slug' => 'autodescription',
|
||||
'required' => false,
|
||||
],
|
||||
[
|
||||
'name' => 'Advanced Custom Fields Pro',
|
||||
'slug' => 'advanced-custom-fields-pro',
|
||||
'required' => false,
|
||||
],
|
||||
];
|
||||
|
||||
/*
|
||||
* Array of configuration settings. Amend each line as needed.
|
||||
*
|
||||
* TGMPA will start providing localized text strings soon. If you already have translations of our standard
|
||||
* strings available, please help us make TGMPA even better by giving us access to these translations or by
|
||||
* sending in a pull-request with .po file(s) with the translations.
|
||||
*
|
||||
* Only uncomment the strings in the config array if you want to customize the strings.
|
||||
*/
|
||||
$config = array(
|
||||
'id' => 'tgmpa', // Unique ID for hashing notices for multiple instances of TGMPA.
|
||||
'default_path' => '', // Default absolute path to bundled plugins.
|
||||
'menu' => 'tgmpa-install-plugins', // Menu slug.
|
||||
'parent_slug' => 'themes.php', // Parent menu slug.
|
||||
'capability' => 'edit_theme_options', // Capability needed to view plugin install page, should be a capability associated with the parent menu used.
|
||||
'has_notices' => true, // Show admin notices or not.
|
||||
'dismissable' => true, // If false, a user cannot dismiss the nag message.
|
||||
'dismiss_msg' => '', // If 'dismissable' is false, this message will be output at top of nag.
|
||||
'is_automatic' => false, // Automatically activate plugins after installation or not.
|
||||
'message' => '', // Message to output right before the plugins table.
|
||||
/*
|
||||
'strings' => array(
|
||||
'page_title' => __( 'Install Required Plugins', 'theme-slug' ),
|
||||
'menu_title' => __( 'Install Plugins', 'theme-slug' ),
|
||||
// <snip>...</snip>
|
||||
'nag_type' => 'updated', // Determines admin notice type - can only be 'updated', 'update-nag' or 'error'.
|
||||
)
|
||||
*/
|
||||
);
|
||||
|
||||
tgmpa($plugins, $config);
|
||||
}
|
31
includes/styles_and_scripts.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Styles and Scripts.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
// Enqueue styles and scripts
|
||||
function themeStarter_enqueue()
|
||||
{
|
||||
$theme_version = filemtime(get_stylesheet_directory() . '/style.css');
|
||||
$script_version = filemtime(get_stylesheet_directory() . '/assets/js/index.js');
|
||||
$style_version = filemtime(get_stylesheet_directory() . '/assets/css/styles.css');
|
||||
|
||||
/* Register and Enqueue Scripts */
|
||||
|
||||
wp_register_script('themeStarter-scripts', get_parent_theme_file_uri('/assets/js/index.js'), [], $script_version, true);
|
||||
wp_enqueue_script('themeStarter-scripts');
|
||||
|
||||
/* Register and Enqueue Styles */
|
||||
|
||||
wp_register_style('themeStarter-styles', get_parent_theme_file_uri('/assets/css/styles.css'), [], $style_version, 'all');
|
||||
wp_enqueue_style('themeStarter-styles');
|
||||
|
||||
wp_register_style('bootstrap-icons', get_parent_theme_file_uri('/assets/css/bootstrap-icons.css'), [], '1.11.1', 'all');
|
||||
wp_enqueue_style('bootstrap-icons');
|
||||
|
||||
wp_register_style('font-awesome', get_parent_theme_file_uri('/assets/css/font-awesome.css'), [], '6.4.2', 'all');
|
||||
wp_enqueue_style('font-awesome');
|
||||
}
|
37
includes/template_content_update.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Update wordpress content on admin init.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
|
||||
function update_page_content_from_file()
|
||||
{
|
||||
// Get all pages
|
||||
$pages = get_pages();
|
||||
|
||||
foreach ($pages as $page) {
|
||||
$slug = $page->post_name;
|
||||
$file_path = get_template_directory() . '/templates/internal/' . $slug . '.php';
|
||||
|
||||
// Check if the file exists
|
||||
if (file_exists($file_path)) {
|
||||
// Start output buffering to capture PHP output
|
||||
ob_start();
|
||||
|
||||
// Include the file to execute its PHP code
|
||||
include($file_path);
|
||||
|
||||
// Get the output and clean the output buffer
|
||||
$file_content = ob_get_clean();
|
||||
|
||||
// Update the page content
|
||||
wp_update_post(array(
|
||||
'ID' => $page->ID,
|
||||
'post_content' => $file_content,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
84
includes/theme_starter_setup.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Theme setup and features.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
function themeStarter_setup()
|
||||
{
|
||||
|
||||
/*
|
||||
* Make theme available for translation.
|
||||
* Translations can be filed in the /languages/ directory.
|
||||
*/
|
||||
|
||||
load_theme_textdomain('themeStarter', get_template_directory() . '/languages');
|
||||
|
||||
// Add default posts and comments RSS feed links to head.
|
||||
add_theme_support('automatic-feed-links');
|
||||
|
||||
/*
|
||||
* Let WordPress manage the document title.
|
||||
*/
|
||||
add_theme_support('title-tag');
|
||||
|
||||
/*
|
||||
* Enable support for Post Thumbnails on posts and pages.
|
||||
*/
|
||||
add_theme_support('post-thumbnails');
|
||||
//Support custom logo
|
||||
add_theme_support('custom-logo');
|
||||
|
||||
// Add menus.
|
||||
register_nav_menus(
|
||||
array(
|
||||
'primary' => __('Main Menu', 'themeStarter'),
|
||||
'secondary' => __('Agency Menu', 'themeStarter'),
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
* Switch default core markup for search form, comment form, and comments
|
||||
* to output valid HTML5.
|
||||
*/
|
||||
|
||||
add_theme_support(
|
||||
'html5',
|
||||
array(
|
||||
'search-form',
|
||||
'comment-form',
|
||||
'comment-list',
|
||||
'gallery',
|
||||
'caption',
|
||||
'style',
|
||||
'script'
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
* Enable support for Post Formats.
|
||||
*/
|
||||
|
||||
add_theme_support(
|
||||
'post-formats',
|
||||
array(
|
||||
'aside',
|
||||
'image',
|
||||
'video',
|
||||
'quote',
|
||||
'link',
|
||||
'gallery',
|
||||
'status',
|
||||
'audio',
|
||||
'chat'
|
||||
)
|
||||
);
|
||||
|
||||
// Enable Woocommerce Theme Support
|
||||
add_theme_support('woocommerce');
|
||||
add_theme_support('wc-product-gallery-zoom');
|
||||
add_theme_support('wc-product-gallery-lightbox');
|
||||
add_theme_support('wc-product-gallery-slider');
|
||||
}
|
146
includes/woo_functions.php
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
add_filter('gettext', 'bbloomer_translate_woocommerce_strings', 999, 3);
|
||||
|
||||
function bbloomer_translate_woocommerce_strings($translated, $text, $domain)
|
||||
{
|
||||
if (!is_admin() && 'woocommerce' === $domain) {
|
||||
|
||||
switch (strtolower($translated)) {
|
||||
|
||||
case 'view cart':
|
||||
$translated = 'View Cart';
|
||||
break;
|
||||
|
||||
case 'proceed to checkout':
|
||||
$translated = 'Checkout Resources';
|
||||
break;
|
||||
|
||||
case 'checkout':
|
||||
$translated = 'Checkout Resources';
|
||||
break;
|
||||
|
||||
case 'add to cart':
|
||||
$translated = 'Add to Cart';
|
||||
break;
|
||||
|
||||
case 'place order':
|
||||
$translated = 'Complete Checkout';
|
||||
break;
|
||||
|
||||
case 'your order':
|
||||
$translated = 'Your Order';
|
||||
break;
|
||||
|
||||
case 'product':
|
||||
$translated = 'Product';
|
||||
break;
|
||||
|
||||
case 'products':
|
||||
$translated = 'Products';
|
||||
break;
|
||||
|
||||
case 'cart totals':
|
||||
$translated = 'Cart Totals';
|
||||
break;
|
||||
|
||||
case 'browse products':
|
||||
$translated = 'Browse Products';
|
||||
break;
|
||||
|
||||
case 'orders':
|
||||
$translated = 'Orders';
|
||||
break;
|
||||
|
||||
case 'return to shop':
|
||||
$translated = 'Find More Products';
|
||||
break;
|
||||
|
||||
// enter a new case for each line where you want Woocommerce text to be changed.
|
||||
}
|
||||
}
|
||||
return $translated;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
|
||||
// Continue Shopping Button Redirect
|
||||
add_filter('woocommerce_continue_shopping_redirect', function () {
|
||||
return get_home_url() . '/shop';
|
||||
});
|
||||
|
||||
function woo_add_continue_shopping_button_to_single()
|
||||
{
|
||||
$shop_page_url = get_permalink(woocommerce_get_page_id('shop'));
|
||||
|
||||
echo '<div class="woocommerce-message">';
|
||||
echo ' <a href="' . $shop_page_url . '" class="button wc-forward">Continue Shopping</a>Looking for more items to add?';
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Add Continue Shopping Button on Cart Page
|
||||
* Add to theme functions.php file or Code Snippets plugin
|
||||
*/
|
||||
add_action('woocommerce_before_cart', 'woo_add_continue_shopping_button_to_cart');
|
||||
|
||||
function woo_add_continue_shopping_button_to_cart()
|
||||
{
|
||||
$shop_page_url = get_permalink(woocommerce_get_page_id('shop'));
|
||||
|
||||
echo '<div class="woocommerce-message">';
|
||||
echo ' <a href="' . $shop_page_url . '" class="button wc-forward">Find More Resources</a>Looking for more items to add?';
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
Remove Unwanted Woocommerce Fields
|
||||
**/
|
||||
function wc_remove_checkout_fields($fields)
|
||||
{
|
||||
|
||||
// Billing fields
|
||||
unset($fields['billing']['billing_company']);
|
||||
// unset($fields['billing']['billing_email']);
|
||||
unset($fields['billing']['billing_phone']);
|
||||
unset($fields['billing']['billing_state']);
|
||||
unset($fields['billing']['billing_first_name']);
|
||||
unset($fields['billing']['billing_last_name']);
|
||||
unset($fields['billing']['billing_address_1']);
|
||||
unset($fields['billing']['billing_address_2']);
|
||||
unset($fields['billing']['billing_city']);
|
||||
// unset($fields['billing']['billing_postcode']);
|
||||
|
||||
// Shipping fields
|
||||
unset($fields['shipping']['shipping_company']);
|
||||
unset($fields['shipping']['shipping_phone']);
|
||||
// unset($fields['shipping']['shipping_state']);
|
||||
// unset($fields['shipping']['shipping_first_name']);
|
||||
// unset($fields['shipping']['shipping_last_name']);
|
||||
// unset($fields['shipping']['shipping_address_1']);
|
||||
unset($fields['shipping']['shipping_address_2']);
|
||||
// unset($fields['shipping']['shipping_city']);
|
||||
// unset($fields['shipping']['shipping_postcode']);
|
||||
|
||||
// Order fields
|
||||
// unset($fields['order']['order_comments']);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
// add_filter('woocommerce_checkout_fields', 'wc_remove_checkout_fields');
|
||||
|
||||
/**
|
||||
Reorder Woocommerce Billing Fields
|
||||
**/
|
||||
|
||||
add_filter('woocommerce_checkout_fields', 'quadlayers_email_top');
|
||||
|
||||
function quadlayers_email_top($checkout_fields)
|
||||
{
|
||||
$checkout_fields['billing']['billing_email']['priority'] = 5;
|
||||
return $checkout_fields;
|
||||
}
|
38
index.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Index template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<!-- Index/Fall Back Template -->
|
||||
<?php get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Single Post/Page Fallback Template -->
|
||||
<section>
|
||||
<div class="max-w-7xl grid md:grid-cols-2 lg:grid-cols-3 gap-4 mx-auto px-4 py-8">
|
||||
<?php
|
||||
if (have_posts()) :
|
||||
while (have_posts()) : the_post(); ?>
|
||||
<div>
|
||||
<div class="mb-4">
|
||||
<img src="<?= get_the_post_thumbnail_url(get_the_ID(), 'full') ?>" alt="">
|
||||
</div>
|
||||
<h1 class="text-lg font-bold mb-2"><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
|
||||
</div>
|
||||
<?php endwhile;
|
||||
else :
|
||||
_e('Sorry, no posts matched your criteria.', 'textdomain');
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
20485
package-lock.json
generated
Normal file
32
package.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "theme-starter-boilerplate-theme",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"preview": "npm-run-all --parallel sync start",
|
||||
"sync": "browser-sync start --proxy \"harplabs.test\" --files \"theme-starter-theme\" --no-notify --no-inject-changes",
|
||||
"wp-build": "wp-scripts build --webpack-no-externals --output-path=assets/js",
|
||||
"wp-start": "wp-scripts start --webpack-no-externals --output-path=assets/js",
|
||||
"tailwind-watch": "npx tailwindcss -i ./src/styles/vendors/tailwind/_source.scss -o ./src/styles/vendors/tailwind/_tailwind.scss --watch",
|
||||
"tailwind-build": "npx tailwindcss -i ./src/styles/vendors/tailwind/_source.scss -o ../src/styles/vendors/tailwind/_tailwind.scss --minify",
|
||||
"sass": "npx sass --watch --no-source-map ./src/styles/styles.scss:./assets/css/styles.css",
|
||||
"dev": "npm-run-all --parallel wp-start tailwind-watch sass sync",
|
||||
"prod": "npm-run-all --sequential tailwind-build sass wp-build",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@wordpress/scripts": "^27.4.0",
|
||||
"browser-sync": "^3.0.2",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"@tailwindcss/aspect-ratio": "^0.4.2",
|
||||
"@tailwindcss/container-queries": "^0.1.1",
|
||||
"@tailwindcss/forms": "^0.5.7",
|
||||
"@tailwindcss/typography": "^0.5.10",
|
||||
"tailwindcss": "^3.4.1",
|
||||
"sass": "^1.61.0"
|
||||
}
|
||||
}
|
104
page-about.php
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* About Us Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<section>
|
||||
|
||||
<div class="grid md:grid-cols-2 max-w-7xl mx-auto py-8 px-4 lg:py-24 gap-4 md:gap-8">
|
||||
<div>
|
||||
<p class="max-w-lg text-stone-500">
|
||||
We are a local software development company and work with business owners like you to digitalize their processes and solve their bottlenecks and problems. We specialize in custom software, which means we can create very specific solutions for the bumps in your very particular road. Whether you'd like to speed up your processes by creating internal company tools for you, or you'd like to develop a brand new product to use in-house or sell to your clients, harpLabs can build it. We've created solutions for many industries such as Health Care, Insurance, Engineering, and IoT, just to name a few.
|
||||
</p>
|
||||
</div>
|
||||
<div class="order-first md:order-last flex items-center justify-center">
|
||||
<img class="w-3/5" src="<?php echo get_template_directory_uri(); ?>/assets/images/logos/harplabs-logo-dark.png" alt="Harplabs Inc Full Logo" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<div class="relative">
|
||||
|
||||
<div class="absolute inset-0">
|
||||
<img class="h-full w-full object-cover" src="https://harplabs.com/wp-content/uploads/2017/12/d3-1024x683.jpg" alt="" />
|
||||
<div class="absolute inset-0 bg-gray-500 mix-blend-multiply" aria-hidden="true"></div>
|
||||
</div>
|
||||
|
||||
<div class="relative mx-auto max-w-7xl py-24 px-4 sm:py-32 sm:px-6 lg:px-8">
|
||||
<h1 class="font-bold mt-8 text-4xl text-white tracking-tight sm:text-5xl lg:text-6xl"><?php _e('We help businesses succeed in the digital and software era.', 'harplabs'); ?></h1>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="bg-white">
|
||||
|
||||
<div class="lg:flex lg:justify-between lg:px-8 max-w-7xl mx-auto px-4 py-16 sm:px-6 sm:py-24">
|
||||
<div>
|
||||
<h2 class="text-4xl text-center font-bold tracking-tight text-gray-900 sm:text-5xl lg:text-6xl"><?php _e('Who we are', 'harplabs'); ?></h2>
|
||||
<img src="<?php echo esc_url(get_template_directory_uri()) . '/assets/images/bgs/technologies.jpg'; ?>" alt="">
|
||||
</div>
|
||||
<p class="mt-5 text-gray-500 text-xl lg:max-w-xl"> <?php _e('Founded in 2012 by Mina Michail, a senior developer with extensive experience in building enterprise solutions, harpLabs inc. has become a renowned provider of custom software solutions for small to large organizations.', 'harplabs'); ?><br /><br /> <?php _e('Based in Mississauga, the company has worked with over 100 clients across Canada and various industries, including medical, healthcare, finance, construction, hospitality, information technology, legal, and insurance, helping them to modernize and optimize their systems.', 'harplabs'); ?><br /><br /> <?php _e('With a track record of success and a reputation for excellence, harpLabs is a trusted partner for businesses seeking to enhance their operations through software and digital marketing.', 'harplabs'); ?> </p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="py-12 sm:pt-16">
|
||||
|
||||
<div class="px-4 sm:px-6 lg:px-8">
|
||||
<div class="mx-auto max-w-7xl text-center">
|
||||
<h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"><?php _e('Trusted by companies in 12+ industries.', 'harplabs'); ?></h2>
|
||||
<p class="mt-3 text-xl text-gray-500 sm:mt-4"><?php _e('We have earned a reputation for delivering high quality products and services. From startups to large corporation, we can help you overcome bottlenecks and challenges.', 'harplabs'); ?></p>
|
||||
<!-- Client Grid -->
|
||||
</div>
|
||||
<?php get_template_part('template-parts/partials/client-grid'); ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="bg-white">
|
||||
|
||||
<h2 class="text-4xl text-center font-bold tracking-tight text-gray-900 sm:text-5xl lg:text-6xl "><?php _e('Why choose us?', 'harplabs'); ?></h2>
|
||||
<div class="lg:px-8 max-w-7xl mx-auto px-4 py-16 sm:px-6">
|
||||
|
||||
<div class="gap-2 grid lg:grid-cols-3 items-stretch justify-center bg-stone-100 p-4">
|
||||
<?php get_template_part('template-parts/partials/why-us-general'); ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="px-4 py-8 sm:px-6 sm:py-10 lg:px-8 bg-stone-100">
|
||||
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<h2 id="offices-heading" class="text-3xl font-bold tracking-tight text-warm-gray-900"><?php _e('Our offices', 'harplabs'); ?></h2>
|
||||
<div class="gap-10 grid grid-cols-1 mt-10 md:grid-cols-3">
|
||||
<div>
|
||||
<h3 class="font-bold text-warm-gray-900 text-xl"><?php _e('Head Office', 'harplabs'); ?></h3>
|
||||
<p class="mt-2 text-base text-warm-gray-500"><span class="block font-medium text-gray-500"><?php _e('Suite 200, 55 Village Centre Place', 'harplabs'); ?></span> <span class="block text-gray-500"><?php _e('Mississauga, ON L4Z 1V9', 'harplabs'); ?></span></p>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="font-bold text-warm-gray-900 text-xl"><?php _e('St. John', 'harplabs'); ?></h3>
|
||||
<p class="mt-2 text-base text-warm-gray-500"><span class="block font-medium text-gray-500"><?php _e('495 Water St.', 'harplabs'); ?></span> <span class="block text-gray-500"><?php _e('St. John's, NL A1C 5X8', 'harplabs'); ?></span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- Client Grid -->
|
||||
<?php get_template_part('template-parts/partials/get-started-cta'); ?>
|
||||
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
70
page-contact.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Contact Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<section class="bg-stone-100 py-8 lg:py-16 flex items-center">
|
||||
|
||||
<div class="max-w-7xl mx-auto lg:grid lg:grid-cols-2 gap-16 px-4">
|
||||
|
||||
<div class="flex-1">
|
||||
|
||||
<h1 class="font-bold text-3xl md:text-4xl lg:text-5xl mb-4">Get in touch with us</h1>
|
||||
<p class="mb-8">We will get in touch with you shortly.</p>
|
||||
|
||||
<div class="flex flex-col gap-x-6 my-8">
|
||||
<p class="font-medium text-lg mb-4">Don't like filling forms?</p>
|
||||
<a href="https://calendly.com/harplabs/discovery" class="w-full text-center rounded-md border border-black bg-yellow-300 px-8 py-2.5 text-sm font-semibold shadow-sm hover:bg-stone-200 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-yellow-600 uppercase">Book a discovery call</a>
|
||||
</div>
|
||||
|
||||
<div class="hidden lg:block py-8">
|
||||
<?php
|
||||
$args = array(
|
||||
'post_type' => 'testimonials',
|
||||
'posts_per_page' => 1,
|
||||
'orderby' => 'rand',
|
||||
'order' => 'ASC',
|
||||
);
|
||||
$query = new WP_Query($args);
|
||||
if ($query->have_posts()) {
|
||||
while ($query->have_posts()) {
|
||||
$query->the_post();
|
||||
?>
|
||||
<div class="list-none">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<div class="inline-block relative">
|
||||
<img src="<?= get_field('testimonial_image') ?>" class="mb-4 mx-auto rounded-full w-44">
|
||||
</div>
|
||||
<p class="text-xl font-medium"><?php _e(the_title(), 'harplabs'); ?></p>
|
||||
<p class="text-lg"><?php _e(get_field('testimonial_position'), 'harplabs'); ?></p>
|
||||
<p class="text-lg text-stone-400"><?php _e(get_field('testimonial_company_name'), 'harplabs'); ?></p>
|
||||
<p class="mt-4 mx-auto text-center"><?php _e(get_field('testimonial_review'), 'harplabs'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<?php }
|
||||
wp_reset_postdata();
|
||||
} else {
|
||||
// No posts found
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<?= do_shortcode('[gravityform id="1" title="false"]') ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
90
page-get-a-quote.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Get A Quote Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<section class="bg-stone-100 py-8 lg:py-16 flex items-center">
|
||||
|
||||
<div class="max-w-7xl mx-auto lg:grid lg:grid-cols-2 gap-16 px-4">
|
||||
|
||||
<div class="flex-1">
|
||||
|
||||
<h1 class="font-bold text-3xl md:text-4xl lg:text-5xl mb-8"><?= the_title() ?></h1>
|
||||
|
||||
<p>Submit your project requirements, and we will prepare and respond with a detailed quote that covers pricing, terms, and timeline.</p>
|
||||
|
||||
<ul class="list-disc list-inside py-4">
|
||||
<li class="flex space-x-4">
|
||||
<i class="bi-check-circle-fill"></i>
|
||||
<p>No Payment Required</p>
|
||||
</li>
|
||||
<li class="flex space-x-4">
|
||||
<i class="bi-check-circle-fill"></i>
|
||||
<p>No Strings Attached</p>
|
||||
</li>
|
||||
<li class="flex space-x-4">
|
||||
<i class="bi-check-circle-fill"></i>
|
||||
<p>100% Risk-Free</p>
|
||||
</li>
|
||||
<li class="flex space-x-4">
|
||||
<i class="bi-check-circle-fill"></i>
|
||||
<p>NDA</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="flex flex-col gap-x-6 my-8">
|
||||
<p class="font-medium text-lg mb-4">Don't like filling forms?</p>
|
||||
<div class="items-center justify-center"><?php get_template_part('template-parts/partials/book-a-meeting-button'); ?></div>
|
||||
</div>
|
||||
|
||||
<div class="hidden lg:block">
|
||||
<?php
|
||||
$args = array(
|
||||
'post_type' => 'testimonials',
|
||||
'posts_per_page' => 1,
|
||||
'orderby' => 'rand',
|
||||
'order' => 'ASC',
|
||||
);
|
||||
$query = new WP_Query($args);
|
||||
if ($query->have_posts()) {
|
||||
while ($query->have_posts()) {
|
||||
$query->the_post();
|
||||
?>
|
||||
<div class="list-none">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<div class="inline-block relative">
|
||||
<img src="<?= get_field('testimonial_image') ?>" class="mb-4 mx-auto rounded-full w-44">
|
||||
</div>
|
||||
<p class="text-xl font-medium"><?php _e(the_title(), 'harplabs'); ?></p>
|
||||
<p class="text-lg"><?php _e(get_field('testimonial_position'), 'harplabs'); ?></p>
|
||||
<p class="text-lg text-stone-400"><?php _e(get_field('testimonial_company_name'), 'harplabs'); ?></p>
|
||||
<p class="mt-4 mx-auto text-center"><?php _e(get_field('testimonial_review'), 'harplabs'); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<?php }
|
||||
wp_reset_postdata();
|
||||
} else {
|
||||
// No posts found
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<?= do_shortcode('[gravityform id="3" title="false"]') ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
24
page-our-work.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Our Work/Portfolio Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<?php //get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Single Page Template -->
|
||||
<section>
|
||||
<div class="max-w-7xl mx-auto px-4">
|
||||
<?php the_content() ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
408
page-privacy-policy.php
Normal file
@@ -0,0 +1,408 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Privacy Policy page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<?php get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Privacy Policy Page Template -->
|
||||
<section class="flex h-full items-center justify-center">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<article class="prose max-w-none py-8 px-4">
|
||||
<p>Last updated: April 14, 2024</p>
|
||||
<p>
|
||||
This Privacy Policy describes Our policies and procedures on the
|
||||
collection, use and disclosure of Your information when You use the
|
||||
Service and tells You about Your privacy rights and how the law protects
|
||||
You.
|
||||
</p>
|
||||
<p>
|
||||
We may use Your Personal data to provide and improve the Service. By using the
|
||||
Service, You agree to the collection and use of information in accordance
|
||||
with this Privacy Policy.
|
||||
</p>
|
||||
<h2>Interpretation and Definitions</h2>
|
||||
<h3>Interpretation</h3>
|
||||
<p>
|
||||
The words of which the initial letter is capitalized have meanings defined
|
||||
under the following conditions. The following definitions shall have the
|
||||
same meaning regardless of whether they appear in singular or in plural.
|
||||
</p>
|
||||
<h3>Definitions</h3>
|
||||
<p>For the purposes of this Privacy Policy:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Account</strong> means a unique account created for You to
|
||||
access our Service or parts of our Service.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Affiliate</strong> means an entity that controls, is
|
||||
controlled by or is under common control with a party, where
|
||||
"control" means ownership of 50% or more of the shares,
|
||||
equity interest or other securities entitled to vote for election of
|
||||
directors or other managing authority.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Application</strong> refers to harpLabs Inc. Website <a href="https://harplabs.com">(https://harplabs.com)</a>, the
|
||||
software program provided by the Company.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Company</strong> (referred to as either "the
|
||||
Company", "We", "Us" or "Our" in
|
||||
this Agreement) refers to The harpLabs Inc. Organization.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Country</strong> refers to: Ontario, Canada</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Device</strong> means any device that can access the Service
|
||||
such as a computer, a cellphone or a digital tablet.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Personal Data</strong> is any information that relates to an
|
||||
identified or identifiable individual.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Service</strong> refers to the Application.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Service Provider</strong> means any natural or legal person
|
||||
who processes the data on behalf of the Company. It refers to
|
||||
third-party companies or individuals employed by the Company to
|
||||
facilitate the Service, to provide the Service on behalf of the
|
||||
Company, to perform services related to the Service or to assist the
|
||||
Company in analyzing how the Service is used.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Usage Data</strong> refers to data collected automatically,
|
||||
either generated by the use of the Service or from the Service
|
||||
infrastructure itself (for example, the duration of a page visit).
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>You</strong> means the individual accessing or using the
|
||||
Service, or the company, or other legal entity on behalf of which such
|
||||
individual is accessing or using the Service, as applicable.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Collecting and Using Your Personal Data</h2>
|
||||
<h3>Types of Data Collected</h3>
|
||||
<h4>Personal Data</h4>
|
||||
<p>
|
||||
While using Our Service, We may ask You to provide Us with certain
|
||||
personally identifiable information that can be used to contact or
|
||||
identify You. Personally identifiable information may include, but is not
|
||||
limited to:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Usage Data</li>
|
||||
</ul>
|
||||
<h4>Usage Data</h4>
|
||||
<p>Usage Data is collected automatically when using the Service.</p>
|
||||
<p>
|
||||
Usage Data may include information such as Your Device's Internet Protocol
|
||||
address (e.g. IP address), browser type, browser version, the pages of our
|
||||
Service that You visit, the time and date of Your visit, the time spent on
|
||||
those pages, unique device identifiers and other diagnostic data.
|
||||
</p>
|
||||
<p>
|
||||
When You access the Service by or through a mobile device, We may collect
|
||||
certain information automatically, including, but not limited to, the type
|
||||
of mobile device You use, Your mobile device unique ID, the IP address of
|
||||
Your mobile device, Your mobile operating system, the type of mobile
|
||||
Internet browser You use, unique device identifiers and other diagnostic
|
||||
data.
|
||||
</p>
|
||||
<p>
|
||||
We may also collect information that Your browser sends whenever You visit
|
||||
our Service or when You access the Service by or through a mobile device.
|
||||
</p>
|
||||
<h3>Use of Your Personal Data</h3>
|
||||
<p>The Company may use Personal Data for the following purposes:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
<strong>To provide and maintain our Service</strong>, including to
|
||||
monitor the usage of our Service.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>To manage Your Account:</strong> to manage Your registration
|
||||
as a user of the Service. The Personal Data You provide can give You
|
||||
access to different functionalities of the Service that are available
|
||||
to You as a registered user.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>For the performance of a contract:</strong> the development,
|
||||
compliance and undertaking of the purchase contract for the products,
|
||||
items or services You have purchased or of any other contract with Us
|
||||
through the Service.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>To contact You:</strong> To contact You by email, telephone
|
||||
calls, SMS, or other equivalent forms of electronic communication,
|
||||
such as a mobile application's push notifications regarding updates or
|
||||
informative communications related to the functionalities, products or
|
||||
contracted services, including the security updates, when necessary or
|
||||
reasonable for their implementation.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>To provide You</strong> with news, special offers and general
|
||||
information about other goods, services and events which we offer that
|
||||
are similar to those that you have already purchased or enquired about
|
||||
unless You have opted not to receive such information.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>To manage Your requests:</strong> To attend and manage Your
|
||||
requests to Us.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>For business transfers:</strong> We may use Your information
|
||||
to evaluate or conduct a merger, divestiture, restructuring,
|
||||
reorganization, dissolution, or other sale or transfer of some or all
|
||||
of Our assets, whether as a going concern or as part of bankruptcy,
|
||||
liquidation, or similar proceeding, in which Personal Data held by Us
|
||||
about our Service users is among the assets transferred.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>For other purposes</strong>: We may use Your information for
|
||||
other purposes, such as data analysis, identifying usage trends,
|
||||
determining the effectiveness of our promotional campaigns and to
|
||||
evaluate and improve our Service, products, services, marketing and
|
||||
your experience.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>We may share Your personal information in the following situations:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>With Service Providers:</strong> We may share Your personal
|
||||
information with Service Providers to monitor and analyze the use of our
|
||||
Service, to contact You.
|
||||
</li>
|
||||
<li>
|
||||
<strong>For business transfers:</strong> We may share or transfer Your
|
||||
personal information in connection with, or during negotiations of, any
|
||||
merger, sale of Company assets, financing, or acquisition of all or a
|
||||
portion of Our business to another company.
|
||||
</li>
|
||||
<li>
|
||||
<strong>With Affiliates:</strong> We may share Your information with Our
|
||||
affiliates, in which case we will require those affiliates to honor this
|
||||
Privacy Policy. Affiliates include Our parent company and any other
|
||||
subsidiaries, joint venture partners or other companies that We control
|
||||
or that are under common control with Us.
|
||||
</li>
|
||||
<li>
|
||||
<strong>With business partners:</strong> We may share Your information
|
||||
with Our business partners to offer You certain products, services or
|
||||
promotions.
|
||||
</li>
|
||||
<li>
|
||||
<strong>With other users:</strong> when You share personal information
|
||||
or otherwise interact in the public areas with other users, such
|
||||
information may be viewed by all users and may be publicly distributed
|
||||
outside.
|
||||
</li>
|
||||
<li>
|
||||
<strong>With Your consent</strong>: We may disclose Your personal
|
||||
information for any other purpose with Your consent.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Retention of Your Personal Data</h3>
|
||||
<p>
|
||||
The Company will retain Your Personal Data only for as long as is
|
||||
necessary for the purposes set out in this Privacy Policy. We will retain
|
||||
and use Your Personal Data to the extent necessary to comply with our
|
||||
legal obligations (for example, if we are required to retain your data to
|
||||
comply with applicable laws), resolve disputes, and enforce our legal
|
||||
agreements and policies.
|
||||
</p>
|
||||
<p>
|
||||
The Company will also retain Usage Data for internal analysis purposes.
|
||||
Usage Data is generally retained for a shorter period of time, except when
|
||||
this data is used to strengthen the security or to improve the
|
||||
functionality of Our Service, or We are legally obligated to retain this
|
||||
data for longer time periods.
|
||||
</p>
|
||||
<h3>Transfer of Your Personal Data</h3>
|
||||
<p>
|
||||
Your information, including Personal Data, is processed at the Company's
|
||||
operating offices and in any other places where the parties involved in
|
||||
the processing are located. It means that this information may be
|
||||
transferred to — and maintained on — computers located outside of Your
|
||||
state, province, country or other governmental jurisdiction where the data
|
||||
protection laws may differ than those from Your jurisdiction.
|
||||
</p>
|
||||
<p>
|
||||
Your consent to this Privacy Policy followed by Your submission of such
|
||||
information represents Your agreement to that transfer.
|
||||
</p>
|
||||
<p>
|
||||
The Company will take all steps reasonably necessary to ensure that Your
|
||||
data is treated securely and in accordance with this Privacy Policy and no
|
||||
transfer of Your Personal Data will take place to an organization or a
|
||||
country unless there are adequate controls in place including the security
|
||||
of Your data and other personal information.
|
||||
</p>
|
||||
<h3>Delete Your Personal Data</h3>
|
||||
<p>
|
||||
You have the right to delete or request that We assist in deleting the
|
||||
Personal Data that We have collected about You.
|
||||
</p>
|
||||
<p>
|
||||
Our Service may give You the ability to delete certain information about
|
||||
You from within the Service.
|
||||
</p>
|
||||
<p>
|
||||
You may update, amend, or delete Your information at any time by signing
|
||||
in to Your Account, if you have one, and visiting the account settings
|
||||
section that allows you to manage Your personal information. You may also
|
||||
contact Us to request access to, correct, or delete any personal
|
||||
information that You have provided to Us.
|
||||
</p>
|
||||
<p>
|
||||
Please note, however, that We may need to retain certain information when
|
||||
we have a legal obligation or lawful basis to do so.
|
||||
</p>
|
||||
<h3>Disclosure of Your Personal Data</h3>
|
||||
<h4>Business Transactions</h4>
|
||||
<p>
|
||||
If the Company is involved in a merger, acquisition or asset sale, Your
|
||||
Personal Data may be transferred. We will provide notice before Your
|
||||
Personal Data is transferred and becomes subject to a different Privacy
|
||||
Policy.
|
||||
</p>
|
||||
<h4>Law enforcement</h4>
|
||||
<p>
|
||||
Under certain circumstances, the Company may be required to disclose Your
|
||||
Personal Data if required to do so by law or in response to valid requests
|
||||
by public authorities (e.g. a court or a government agency).
|
||||
</p>
|
||||
<h4>Other legal requirements</h4>
|
||||
<p>
|
||||
The Company may disclose Your Personal Data in the good faith belief that
|
||||
such action is necessary to:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Comply with a legal obligation</li>
|
||||
<li>Protect and defend the rights or property of the Company</li>
|
||||
<li>
|
||||
Prevent or investigate possible wrongdoing in connection with the
|
||||
Service
|
||||
</li>
|
||||
<li>Protect the personal safety of Users of the Service or the public</li>
|
||||
<li>Protect against legal liability</li>
|
||||
</ul>
|
||||
<h3>Security of Your Personal Data</h3>
|
||||
<p>
|
||||
The security of Your Personal Data is important to Us, but remember that
|
||||
no method of transmission over the Internet, or method of electronic
|
||||
storage is 100% secure. While We strive to use commercially acceptable
|
||||
means to protect Your Personal Data, We cannot guarantee its absolute
|
||||
security.
|
||||
</p>
|
||||
<h2>Children's Privacy</h2>
|
||||
<p>
|
||||
Our Service does not address anyone under the age of 13. We do not
|
||||
knowingly collect personally identifiable information from anyone under
|
||||
the age of 13. If You are a parent or guardian and You are aware that Your
|
||||
child has provided Us with Personal Data, please contact Us. If We become
|
||||
aware that We have collected Personal Data from anyone under the age of 13
|
||||
without verification of parental consent, We take steps to remove that
|
||||
information from Our servers.
|
||||
</p>
|
||||
<p>
|
||||
If We need to rely on consent as a legal basis for processing Your
|
||||
information and Your country requires consent from a parent, We may
|
||||
require Your parent's consent before We collect and use that information.
|
||||
</p>
|
||||
<h2>Links to Other Websites</h2>
|
||||
<p>
|
||||
Our Service may contain links to other websites that are not operated by
|
||||
Us. If You click on a third party link, You will be directed to that third
|
||||
party's site. We strongly advise You to review the Privacy Policy of every
|
||||
site You visit.
|
||||
</p>
|
||||
<p>
|
||||
We have no control over and assume no responsibility for the content,
|
||||
privacy policies or practices of any third party sites or services.
|
||||
</p>
|
||||
<h2>Changes to this Privacy Policy</h2>
|
||||
<p>
|
||||
We may update Our Privacy Policy from time to time. We will notify You of
|
||||
any changes by posting the new Privacy Policy on this page.
|
||||
</p>
|
||||
<p>
|
||||
We will let You know via email and/or a prominent notice on Our Service,
|
||||
prior to the change becoming effective and update the "Last
|
||||
updated" date at the top of this Privacy Policy.
|
||||
</p>
|
||||
<p>
|
||||
You are advised to review this Privacy Policy periodically for any
|
||||
changes. Changes to this Privacy Policy are effective when they are posted
|
||||
on this page.
|
||||
</p>
|
||||
<h2>Contact Us</h2>
|
||||
<p>
|
||||
If you have any questions about this Privacy Policy, You can contact us:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>By email: <a href="mailto:info@harplabs.com">info@harplabs.com</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
By visiting this page on our website:
|
||||
<a href="<?php echo get_site_url() ?>/privacy-policy" rel="external nofollow noopener" target="_blank"><?= bloginfo('name') ?> Privacy Policy</a>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
</article>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
45
page-start-a-conversation.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Start A Conversation Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
|
||||
<section class="py-8 lg:py-16">
|
||||
|
||||
<div class="max-w-7xl mx-auto space-y-2 text-center px-4">
|
||||
<p class="text-xl lg:text-2xl font-medium">Get a Free Consulation</p>
|
||||
<h1 class="text-2xl lg:text-4xl font-bold">The first step to find how we can work together</h1>
|
||||
<p class="text-lg lg:text-xl">We will communicate with you to get a big picture of your needs, goals, vision and requirements. From there we will deliver a no obligation outlining of how we can bring your project to life.</p>
|
||||
</div>
|
||||
|
||||
<div class="max-w-7xl mx-auto grid gap-4 lg:grid-cols-2 py-8 px-4">
|
||||
<div class="bg-yellow-200 p-8">
|
||||
<p class="font-bold">Schedule a Call</p>
|
||||
<p>Book a call at your convenience to discuss your requirements and goals with a project manager</p>
|
||||
<div class="mt-8">
|
||||
<?php get_template_part('template-parts/partials/book-a-meeting-button'); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-yellow-100 p-8">
|
||||
<p class="font-bold">Submit a Quote inquiry</p>
|
||||
<p>The fastest way to communicate requirements with us and even get started with a new project.</p>
|
||||
<div class="mt-8">
|
||||
<?php get_template_part('template-parts/partials/get-a-quote-button'); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
71
page-terms-and-conditions.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Terms and Conditions page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<?php get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Terms and Conditions Template -->
|
||||
<section class="flex h-full items-center justify-center">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<article class="prose max-w-none py-8 px-4">
|
||||
<p>Welcome to harpLabs Inc!</p>
|
||||
<p>These terms and conditions outline the rules and regulations for the use of harpLabs' Website, located at www.harplabs.com</p>
|
||||
<p>By accessing this website we assume you accept these terms and conditions. Do not continue to use harpLabs if you do not agree to take all of the terms and conditions stated on this page.</p>
|
||||
<p>The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and all Agreements: "Client", "You" and "Your" refers to you, the person log on this website and compliant to the Company’s terms and conditions. "The Company", "Ourselves", "We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner for the express purpose of meeting the Client’s needs in respect of provision of the Company’s stated services, in accordance with and subject to, prevailing law of Canada, Ontario. Any use of the above terminology or other words in the singular, plural, capitalization and/or he/she or they, are taken as interchangeable and therefore as referring to same.</p>
|
||||
<h3>Cookies</h3>
|
||||
<p>We employ the use of cookies. By accessing harpLabs, you agreed to use cookies in agreement with harpLabs' Privacy Policy.</p>
|
||||
<p>Most interactive websites use cookies to let us retrieve the user’s details for each visit. Cookies are used by our website to enable the functionality of certain areas to make it easier for people visiting our website. Some of our affiliate/advertising partners may also use cookies.</p>
|
||||
<h3>License</h3>
|
||||
<p>Unless otherwise stated, harpLabs and/or its licensors own the intellectual property rights for all material on harpLabs. All intellectual property rights are reserved. You may access this from harpLabs for your own personal use subjected to restrictions set in these terms and conditions.</p>
|
||||
<p>You must not:</p>
|
||||
<ul>
|
||||
<li>Republish material from harpLabs</li>
|
||||
<li>Sell, rent or sub-license material from harpLabs</li>
|
||||
<li>Reproduce, duplicate or copy material from harpLabs</li>
|
||||
<li>Redistribute content from harpLabs</li>
|
||||
</ul>
|
||||
<p>This Agreement shall begin on the date hereof.</p>
|
||||
<h3>Hyperlinking to our Content</h3>
|
||||
<p>The following organizations may link to our Website without prior written approval:</p>
|
||||
<ul>
|
||||
<li>Government agencies</li>
|
||||
<li>Search engines</li>
|
||||
<li>News organizations</li>
|
||||
<li>Online directory distributors may link to our Website in the same manner as they hyperlink to the Websites of other listed businesses; and</li>
|
||||
<li>System wide Accredited Businesses except soliciting non-profit organizations, charity shopping malls, and charity fundraising groups which may not hyperlink to our Web site.</li>
|
||||
</ul>
|
||||
<p>These organizations may link to our home page, to publications or to other Website information so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products and/or services; and (c) fits within the context of the linking party’s site.</p>
|
||||
<h3>iFrames</h3>
|
||||
<p>Without prior approval and written permission, you may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website.</p>
|
||||
<h3>Content Liability</h3>
|
||||
<p>We shall not be hold responsible for any content that appears on your Website. You agree to protect and defend us against all claims that is rising on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights.</p>
|
||||
<h3>Reservation of Rights</h3>
|
||||
<p>We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amen these terms and conditions and it’s linking policy at any time. By continuously linking to our Website, you agree to be bound to and follow these linking terms and conditions.</p>
|
||||
<h3>Removal of links from our website</h3>
|
||||
<p>If you find any link on our Website that is offensive for any reason, you are free to contact and inform us any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly.</p>
|
||||
<p>We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up to date.</p>
|
||||
<h3>Disclaimer</h3>
|
||||
<p>To the maximum extent permitted by applicable law, we exclude all representations, warranties, and conditions relating to our website and the use of this website. Nothing in this disclaimer will:</p>
|
||||
<ul>
|
||||
<li>limit or exclude our or your liability for death or personal injury;</li>
|
||||
<li>limit or exclude our or your liability for fraud or fraudulent misrepresentation;</li>
|
||||
<li>limit any of our or your liabilities in any way that is not permitted under applicable law; or</li>
|
||||
<li>exclude any of our or your liabilities that may not be excluded under applicable law.</li>
|
||||
</ul>
|
||||
<p>The limitations and prohibitions of liability set in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort and for breach of statutory duty.</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
24
page.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Standard Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<?php get_template_part('template-parts/partials/page-header') ?>
|
||||
|
||||
<!-- Single Page Template -->
|
||||
<section>
|
||||
<div class="max-w-7xl mx-auto px-4">
|
||||
<?php the_content() ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
BIN
screenshot.png
Normal file
After Width: | Height: | Size: 248 KiB |
99
search.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Search results page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
<section class="h-full overflow-scroll no-scrollbar bg-white pb-24">
|
||||
|
||||
<div class="flex flex-col">
|
||||
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
|
||||
<a class="flex items-center space-x-2 p-4" href="<?php echo get_site_url(); ?>">
|
||||
<img width="200px" src="<?php echo get_template_directory_uri(); ?>/assets/images/logos/harplabs-logo-dark.png" alt="MGP Logo">
|
||||
</a>
|
||||
|
||||
<?php
|
||||
$numberOfPostsFound = count($posts);
|
||||
?>
|
||||
|
||||
<div class="w-full bg-yellow-300 p-4">
|
||||
<p class="text-2xl max-w-7xl mx-auto">Results for "<?= esc_html(get_search_query(false)) ?>" (<?= $numberOfPostsFound ?>)</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="py-8">
|
||||
<?php if (have_posts()) { ?>
|
||||
|
||||
<ul class="relative max-w-7xl mx-auto space-y-4 px-4">
|
||||
<?php while (have_posts()) {
|
||||
the_post(); ?>
|
||||
|
||||
<li class="w-full">
|
||||
<div>
|
||||
<a class="font-medium underline" href="<?= the_permalink() ?>">
|
||||
<?= the_title() ?>
|
||||
</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
</ul> <?php } else { ?>
|
||||
|
||||
<div class="w-full px-4">
|
||||
<p class="max-w-7xl mx-auto text-2xl">
|
||||
No results for "<?= esc_html(get_search_query(false)) ?>"
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="px-2 pt-4 pb-8 bg-cadet-200">
|
||||
<div class="flex items-center justify-center">
|
||||
<h1 class="font-medium text-2xl p-4">Visit category pages</h1>
|
||||
<i class="bi-arrow-down inline font-medium text-2xl p-4"></i>
|
||||
</div>
|
||||
<ul class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-2 max-w-7xl mx-auto">
|
||||
|
||||
<?php $pages = get_pages_as_array();
|
||||
foreach ($pages as $page) {
|
||||
$pageID = $page['page']->ID;
|
||||
$pageTitle = $page['page']->post_title;
|
||||
$pageSlug = $page['page']->post_name;
|
||||
$pageBG = $page['page']->post_name . '.png';
|
||||
// $pageBootstrapIcon = get_field('bootstrap_icon', $page['page']->ID);
|
||||
?>
|
||||
<li class="category-cards flex rounded-md shadow-md relative border border-stone-500 overflow-hidden w-full">
|
||||
<a class="relative w-full text-center py-10 space-y-2 flex items-center flex-col justify-center" href="<?php echo $pageSlug ?>">
|
||||
<div class="absolute inset-0 flex items-center justify-center bg-opacity-50 rounded-md py-2 px-2">
|
||||
<!-- <i class="<?php echo $pageBootstrapIcon ?> text-2xl" aria-hidden="true"></i> -->
|
||||
<h2 class="text-sm font-medium"><?php echo $pageTitle ?></h2>
|
||||
<!-- <p class="font-medium lg:text-center"><?php echo get_field('description', $pageID); ?></p> -->
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
<?php } ?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
18
searchform.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Search form template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Header Search -->
|
||||
<section class="relative">
|
||||
<div id="search-overlay" class="fixed top-0 left-0 bg-black bg-opacity-60"></div>
|
||||
<form method="get" action="<?= esc_url(site_url('/')) ?>" id="header-search" class="absolute h-full w-full p-4 flex inset-0 items-center max-w-7xl mx-auto">
|
||||
<div class="absolute left-8 h-full flex items-center"><i class="bi bi-search"></i></div>
|
||||
<input autocomplete="off" type="search" id="s" name="s" class="pl-10 focus:border-white rounded-md w-full" type="text" placeholder="Search...">
|
||||
</form>
|
||||
</section>
|
230
single-solutions.php
Normal file
@@ -0,0 +1,230 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Solution Landing Page template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php
|
||||
// Check if the 'gads' parameter exists in the URL
|
||||
if (isset($_GET['ad'])) {
|
||||
// Load specific header for when 'gads' parameter exists
|
||||
get_header('landing');
|
||||
} else {
|
||||
// Load default header
|
||||
get_header();
|
||||
}
|
||||
?>
|
||||
|
||||
<!-- Single Solution -->
|
||||
<section class="bg-stone-100 py-8 flex items-center">
|
||||
|
||||
<div class="max-w-7xl mx-auto md:grid md:grid-cols-2 gap-8 px-4 items-center">
|
||||
|
||||
<div class="flex-1">
|
||||
|
||||
<h2 class="font-medium"><?= get_field("solution_products_list_subheading") ?>...</h2>
|
||||
|
||||
<h1 class="font-bold text-3xl md:text-4xl lg:text-5xl"><?= the_title() ?></h1>
|
||||
|
||||
<ul class="py-4">
|
||||
<?php while (have_rows('solution_facts_and_data')) :
|
||||
|
||||
the_row();
|
||||
$sub_value = get_sub_field('solution_fact'); ?>
|
||||
|
||||
<li class="flex space-x-4">
|
||||
<i class="bi-check-circle-fill"></i>
|
||||
<p><?php echo $sub_value; ?></p>
|
||||
</li>
|
||||
|
||||
<?php endwhile; ?>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="mt-4 space-y-2 md:flex md:space-x-2 md:space-y-0">
|
||||
<?php get_template_part('template-parts/partials/book-a-meeting-button') ?>
|
||||
<?php get_template_part('template-parts/partials/get-a-quote-button') ?>
|
||||
</div>
|
||||
|
||||
<ul class="list-disc list-inside py-4">
|
||||
<li>No Payment Required</li>
|
||||
<li>No Strings Attached</li>
|
||||
<li>100% Risk-Free</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
<div class="bg-white rounded-3xl h-4/5 py-8 px-4 flex flex-col justify-center relative">
|
||||
<h3 class="py-2.5 px-8 bg-stone-100 bg-opacity-60 inline-block shadow-md min-w-max mx-auto font-bold text-xl text-center relative z-10">Your <?= str_replace('Development', '', get_the_title()) ?> partner</h3>
|
||||
<img src="<?= get_field('solution_image') ?>" alt="">
|
||||
<?php
|
||||
$args = array(
|
||||
'post_type' => 'technologies',
|
||||
'posts_per_page' => 4,
|
||||
'orderby' => 'rand',
|
||||
'order' => 'ASC',
|
||||
'tax_query' => array(
|
||||
array(
|
||||
'taxonomy' => 'technologies_category',
|
||||
'field' => 'slug', // You can use 'id', 'slug', or 'name' depending on how you want to specify the term
|
||||
'terms' => get_post_field('post_name', get_the_ID()), // Replace 'your-term-slug' with the slug of the term you want to filter by
|
||||
),
|
||||
),
|
||||
);
|
||||
$query = new WP_Query($args);
|
||||
|
||||
if ($query->have_posts()) { ?>
|
||||
<ul class="gap-4 grid grid-cols-4 items-center">
|
||||
<?php
|
||||
$vertical_values = array('lg:top-10', 'lg:top-4/5', 'lg:top-3/4', 'lg:top-2'); // Adjust top values if necessary
|
||||
$horizontal_values = array('lg:-left-10', 'lg:-right-10', 'lg:-left-10', 'lg:-right-16'); // Adjust left values if necessary
|
||||
$index = 0;
|
||||
while ($query->have_posts()) {
|
||||
$query->the_post(); ?>
|
||||
<li class="list-none relative lg:absolute <?= $horizontal_values[$index]; ?> <?= $vertical_values[$index]; ?> lg:p-8 lg:bg-stone-100 lg:shadow-md rounded-full">
|
||||
<img src="<?= get_field('technology_image') ?>" alt="<?= the_title() ?> logo" class="mx-auto max-h-12">
|
||||
</li>
|
||||
<?php
|
||||
$index++;
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
<?php }
|
||||
wp_reset_postdata(); ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Services -->
|
||||
<section>
|
||||
|
||||
<div class="max-w-7xl mx-auto py-12 px-4">
|
||||
|
||||
<h2 class="text-center font-bold text-3xl md:text-4xl lg:text-5xl mb-4">
|
||||
<?= the_title() ?> Services
|
||||
</h2>
|
||||
<h3 class="text-center lg:text-xl">A tailored selection of <?= the_title() ?> Services we carefully crafted for you.</h3>
|
||||
|
||||
<ul class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 py-8">
|
||||
|
||||
<?php while (have_rows('solution_services')) :
|
||||
|
||||
the_row(); ?>
|
||||
|
||||
<li class="text-center md:text-left">
|
||||
<img src="<?= get_sub_field('solution_services_icon'); ?>" alt="">
|
||||
<p class="font-medium text-xl"><?= get_sub_field('solution_service_title'); ?></p>
|
||||
<p class="text-lg"><?= get_sub_field('solution_service_description'); ?></p>
|
||||
</li>
|
||||
|
||||
|
||||
<?php endwhile; ?>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Testimonials -->
|
||||
<section>
|
||||
|
||||
<div class="mx-auto py-12 px-4">
|
||||
<h2 class="text-center font-bold text-3xl md:text-4xl lg:text-5xl mb-4">
|
||||
Our Clients, Friends & Professional Partners.
|
||||
</h2>
|
||||
|
||||
<?php get_template_part('template-parts/partials/client-grid'); ?>
|
||||
|
||||
|
||||
<?php get_template_part('template-parts/partials/testimonials-loop'); ?>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<!-- Technologies Ticker -->
|
||||
<?php get_template_part('template-parts/partials/technologies-ticker'); ?>
|
||||
|
||||
<?php if (have_rows('solution_features')) : ?>
|
||||
<!-- Features -->
|
||||
<section>
|
||||
|
||||
<div class="max-w-7xl mx-auto py-12 px-4">
|
||||
|
||||
<h2 class="text-center font-bold text-3xl md:text-4xl lg:text-5xl mb-4">
|
||||
Value filled <?= the_title() ?>
|
||||
</h2>
|
||||
<h3 class="text-center lg:text-xl">The benefits you reap with us as your consultant or <?= strtolower(get_the_title()) ?> service provider</h3>
|
||||
|
||||
<ul class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 py-8">
|
||||
|
||||
<?php while (have_rows('solution_features')) :
|
||||
|
||||
the_row(); ?>
|
||||
|
||||
<li class="text-center md:text-left">
|
||||
<div class="flex items-center justify-center space-x-4 mb-4">
|
||||
<img width="15%" src="<?= get_sub_field('solution_feature_icon'); ?>" alt="Solution Feature Icon">
|
||||
<p class="font-medium text-xl"><?= get_sub_field('solution_feature_title'); ?></p>
|
||||
</div>
|
||||
<p class="text-lg text-center"><?= get_sub_field('solution_feature_description'); ?></p>
|
||||
</li>
|
||||
|
||||
|
||||
<?php endwhile; ?>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
|
||||
<!-- Why Us -->
|
||||
<section class="bg-stone-200">
|
||||
<div class="py-10">
|
||||
<div class="flex flex-col max-w-7xl mx-auto px-4 relative z-10">
|
||||
<div class="text-inherit">
|
||||
<div class="mb-12 text-center text-inherit">
|
||||
<p class="font-bold mb-4 text-3xl text-gray-900 tracking-tight sm:text-4xl"><?php _e('Why us?', 'harplabs'); ?></p>
|
||||
<div class="bg-yellow-300 h-0.5 mx-auto w-28"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Why Us -->
|
||||
<div class="gap-2 grid md:grid-cols-2 lg:grid-cols-3 items-stretch justify-center">
|
||||
<?php get_template_part('template-parts/partials/why-us-general'); ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Process -->
|
||||
<?php get_template_part('template-parts/partials/process-general'); ?>
|
||||
|
||||
<!-- FAQs -->
|
||||
<section>
|
||||
<div class="max-w-5xl mx-auto py-12">
|
||||
<h3 class="font-bold text-3xl md:text-4xl lg:text-5xl mb-8 text-center">Questions we get asked often.</h3>
|
||||
<?php get_template_part('template-parts/partials/faqs-loop') ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Started -->
|
||||
<?php get_template_part('template-parts/partials/get-started-cta') ?>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
41
single.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Index template.
|
||||
*
|
||||
* @package ThemeStarter
|
||||
*/
|
||||
|
||||
?>
|
||||
|
||||
<!-- Get Header -->
|
||||
<?php get_header(); ?>
|
||||
|
||||
|
||||
<!-- Single Post/Page Fallback Template -->
|
||||
<section>
|
||||
<div class="max-w-7xl mx-auto px-4 py-8">
|
||||
<?php
|
||||
if (have_posts()) :
|
||||
while (have_posts()) : the_post(); ?>
|
||||
<div>
|
||||
<div class="mb-4 flex ">
|
||||
<img class="mx-auto" src="<?= get_the_post_thumbnail_url(get_the_ID(), 'medium_large') ?>" alt="">
|
||||
</div>
|
||||
<h1 class="text-lg text-center font-bold mb-2"><?php the_title(); ?></h1>
|
||||
</div>
|
||||
<article>
|
||||
<div class="prose max-w-none">
|
||||
<?php the_content() ?>
|
||||
</div>
|
||||
</article>
|
||||
<?php endwhile;
|
||||
else :
|
||||
_e('Sorry, no posts matched your criteria.', 'textdomain');
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Get Footer -->
|
||||
<?php get_footer(); ?>
|
13
src/index.js
Normal file
@@ -0,0 +1,13 @@
|
||||
// import './styles/styles.scss';
|
||||
|
||||
// import React from 'react';
|
||||
// import { createRoot } from 'react-dom/client';
|
||||
import CollapsePanel from './scripts/CollapsePanel';
|
||||
import NavControl from './scripts/NavControl';
|
||||
import ContactTabs from './scripts/ContactTabs';
|
||||
// import TestModule from './scripts/TestModule';
|
||||
|
||||
// createRoot(document.querySelector('#root')).render(<ExampleReactComponent />);
|
||||
const collapsePanel = new CollapsePanel();
|
||||
// const testModule = new TestModule();
|
||||
const navControl = new NavControl();
|