Jake Vanderwerf
2026-02-10 1e981179fc999d873000683b869aef01284827af
=jakevan latest
3 files renamed
2 files deleted
14 files modified
12 files added
1846 ■■■■■ changed files
ajakevan.php 146 ●●●●● patch | view | raw | blame | history
assets/icons/jakevan.svg patch | view | raw | blame | history
assets/icons/loading.svg 17 ●●●●● patch | view | raw | blame | history
assets/icons/logo-concentric-jakevan.svg 17 ●●●●● patch | view | raw | blame | history
assets/icons/logo-concentric.svg 17 ●●●●● patch | view | raw | blame | history
assets/icons/logo-right-aligned-jakevan.svg 17 ●●●●● patch | view | raw | blame | history
assets/icons/logo-right-aligned.svg 17 ●●●●● patch | view | raw | blame | history
blocks/_setup.php 122 ●●●●● patch | view | raw | blame | history
content/_setup.php 8 ●●●●● patch | view | raw | blame | history
content/art.php 178 ●●●●● patch | view | raw | blame | history
content/design.php 126 ●●●●● patch | view | raw | blame | history
content/development.php 113 ●●●●● patch | view | raw | blame | history
content/strategy.php 112 ●●●●● patch | view | raw | blame | history
content/support.php 1 ●●●● patch | view | raw | blame | history
content/writing.php 112 ●●●●● patch | view | raw | blame | history
email/_setup.php 311 ●●●●● patch | view | raw | blame | history
forms/_setup.php 25 ●●●●● patch | view | raw | blame | history
forms/contact.php 64 ●●●●● patch | view | raw | blame | history
forms/setup.php 1 ●●●● patch | view | raw | blame | history
login/_setup.php 40 ●●●●● patch | view | raw | blame | history
login/setup.php 18 ●●●●● patch | view | raw | blame | history
seo.php 134 ●●●●● patch | view | raw | blame | history
taxonomies/_setup.php 6 ●●●●● patch | view | raw | blame | history
taxonomies/city.php 16 ●●●●● patch | view | raw | blame | history
taxonomies/form.php 15 ●●●●● patch | view | raw | blame | history
taxonomies/media.php 17 ●●●●● patch | view | raw | blame | history
taxonomies/progress.php 9 ●●●●● patch | view | raw | blame | history
taxonomies/project.php 138 ●●●●● patch | view | raw | blame | history
taxonomies/style.php 19 ●●●● patch | view | raw | blame | history
taxonomies/target.php 12 ●●●●● patch | view | raw | blame | history
taxonomies/theme.php 18 ●●●●● patch | view | raw | blame | history
ajakevan.php
@@ -53,13 +53,16 @@
const AJV_DIR = WP_PLUGIN_DIR . '/ajakevan';
define('AJV_URL', plugin_dir_url(__FILE__));
require(AJV_DIR . '/content/setup.php');
require(AJV_DIR . '/blocks/_setup.php');
require(AJV_DIR . '/content/_setup.php');
//require(AJV_DIR . '/dashboard/setup.php');
//require(AJV_DIR . '/forms/setup.php');
require(AJV_DIR . '/login/setup.php');
require(AJV_DIR . '/taxonomies/setup.php');
require(AJV_DIR . '/forms/_setup.php');
require(AJV_DIR . '/email/_setup.php');
require(AJV_DIR . '/login/_setup.php');
require(AJV_DIR . '/taxonomies/_setup.php');
//require(AJV_DIR . '/users/setup.php');
//require(AJV_DIR . '/files/fileManagement.php');
require(AJV_DIR . '/seo.php');
/**
@@ -83,9 +86,10 @@
{
    return [
        'icons'               => 'light',
        'is_directory'        => false,        //as in, a membership directory
        'is_directory'        => true,        //as in, a membership directory
        'directory_label'     => ['List', 'Lists'],
        'has_membership'      => false,
        'has_map'             => true,
//        'has_map'             => true,
        'dashboard'           => true,
        'support'         => true,
        'feed_block'      => true,
@@ -96,15 +100,16 @@
            'facebook'    => false,
            'maps'        => true,
            'gmb'         => true,
            'helcim'      => false,
            'helcim'      => true,
            'instagram'   => false,
            'square'      => true,
            'square'      => false,
            'umami'       => true,
            'postmark'       => true,
        ],
        'is_restaurant'       => false,
        'limit_hours'         => false,
        'enthusiast'          => true,
        'favourites'          => true,    //optional flag to allow enthusiasts, but not favourites
        'favourites'          => false,    //optional flag to allow enthusiasts, but not favourites
    ];
}
/**
@@ -140,3 +145,126 @@
//{
//    return [];
//}
add_filter('jvbLoadingIcon', 'ajv_loading_icon', 999999);
function ajv_loading_icon():string
{
    return 'loading';
}
add_filter('jvbDrawerItems', 'jvDrawerItems', 10, 2);
function jvDrawerItems(array $items, string $menuID):array
{
    if ($menuID !== 'main') {
        return $items;
    }
    $items = [
        [
            'text'  => 'About Jake',
            'url'   => home_url('/about'),
            'icon'  => 'user-square',
        ]
    ];
    foreach (JVB_CONTENT as $slug => $config) {
        if (array_key_exists('public', $config) && !$config['public']) {
            continue;
        }
        $items[] = [
            'text'  => $config['singular'],
            'url'   => get_post_type_archive_link(BASE.$slug),
            'icon'  => $config['icon'],
            'class' => $slug,
        ];
    }
    $items[] = [
        'text'      => 'Contact',
        'icon'      => 'chat-teardrop',
        'url'       => home_url('/contact'),
    ];
//    $items[] = [
//            'text'  => 'Account',
//            'url'   => home_url('/dash'),
//            'icon'  => 'user-circle',
//        ];
    return $items;
}
add_filter('jvbBeforeFooter', 'ajv_acknowledgement');
function ajv_acknowledgement():string
{
    return '<p>I live and work in amiskwacîwâskahikan ᐊᒥᐢᑲᐧᒋᐋᐧᐢᑲᐦᐃᑲᐣ</p><p><a href="https://www.treatysix.org/#comp-lkljqlw1" title="Learn More">Treaty 6 territory</a></p><p>Edmonton, Alberta, Canada</p>';
}
add_filter('jvbRegisterCustomIcons', 'jv_custom_icons');
function jv_custom_icons(array $icons):array
{
    $icons['logo'] = AJV_DIR . '/assets/icons/logo-concentric.svg';
    $icons['logo-jakevan'] = AJV_DIR . '/assets/icons/logo-concentric-jakevan.svg';
    $icons['logo-right'] = AJV_DIR . '/assets/icons/logo-right-aligned.svg';
    $icons['logo-right-jakevan'] = AJV_DIR . '/assets/icons/logo-right-aligned-jakevan.svg';
    $icons['jakevan'] = AJV_DIR . '/assets/icons/jakevan.svg';
    $icons['loading'] = AJV_DIR . '/assets/icons/loading.svg';
    return $icons;
}
add_filter('jvbMenuExtra', 'ajv_contact_nav', 10, 3);
function ajv_contact_nav(string $nav, string $menuName, array $block):string
{
    if (array_key_exists('attrs', $block)
        && array_key_exists('className', $block['attrs'])
        && $block['attrs']['className'] === 'is-style-fixed'
        && $nav === '') {
        $text = '<li><a href="'.jvbTextLink(8258239916,'I have an idea - can you help bring it to life?').'" title="Text Me">'.jvbIcon('chat').'<span class="hide-small">825.823.9916</span></a></li>';
        $email = '<li><a href="'.jvbMailToLink(
                'get@jakevan.ca',
                '[JakeVan] I have an idea - can you help bring it to life?','Be sure to as much detail as possible, including what your idea is about, when you need it done by, and budget.'
            ).'" title="Email Me">'.jvbIcon('envelope').'<span class="hide-small">get@jakevan.ca</span></a></li>';
        return $text.$email;
    }
    return $nav;
}
add_filter('jvbRandomFooterText', 'ajv_footer_text');
function ajv_footer_text(string $text):string
{
    $privacy = get_privacy_policy_url();
    $privacy = ($privacy === '') ? '' : ' | <a href="'.$privacy.'">Privacy Policy</a>';
    return '<p class="font-small">©'.date('Y').' <a href="'.get_home_url().'">'.get_bloginfo('name').'</a>'.$privacy.' | <a href="'.get_home_url(null, '/legal/terms-of-service/').'" title="Terms of Service">Terms of Service</a></p><p class="font-small">Built with ♡ by <a href="https://jakevan.ca">Jake Van</a>  <small>(of course!)</small></p>';
}
add_filter('jvbSummaryHeader', 'ajv_summary_header', 10, 2);
function ajv_summary_header(string $return, string $type):string
{
    $extra = match($type) {
        'strategy'  => 'Edmonton-focused brand',
        default => 'Edmonton made'
    };
    $title = ($type === 'directory') ? 'Directory' : JVB_CONTENT[$type]['singular'];
    return '<small>'.$extra.'</small>'.$title.'.';
}
add_filter('jvbSummaryHeaderExtra', 'altr_summary_extra', 10, 2);
function altr_summary_extra(string $return, string $type):string
{
    return ($type === 'directory') ? '' : '<p>Or see <a href="'.JVB()->directories()->getDirectoryList()[$type]['url'].'">alphabetical list</a>.</p>';
}
function ajv_render_core_post_content(array $block, string $content = ''):string
{
    if(!is_singular(array_map(function($item) { return BASE.$item; }, array_keys(JVB_CONTENT)))) {
        return JVB()->blocks()->render_core_post_content($block, $content);
    }
    $postType = jvbNoBase(get_post_type());
    $function = "ajv_render_{$postType}_content";
    $base = '';
    if (function_exists($function)) {
        $base = call_user_func($function, $block, $content);
    }
    return $base.JVB()->blocks()->render_core_post_content($block, $content);
}
assets/icons/jakevan.svg
assets/icons/loading.svg
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   width="32"
   height="32"
   viewBox="0 0 32 32"
   version="1.1"
   xml:space="preserve"
   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
   id="svg10"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"><defs
   id="defs10" />
    <path
   id="path11"
   style="baseline-shift:baseline;display:inline;overflow:visible;vector-effect:none;fill:#222222;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
   d="m 16.621094,1.1425781 c -8.2663232,0 -16.22086738,6.4428095 -15.5859378,14.6855469 0.6013455,7.807308 7.4341264,14.12698 14.9335938,14.943359 8.839845,0.962283 15.505469,-6.376919 15.005859,-14.986328 C 30.4959,7.5362684 24.883397,1.1425781 16.621094,1.1425781 Z m 0,0.6503907 C 26.488786,1.8038645 29.714518,9.5935833 30.302734,15.804688 31.141982,24.666365 22.160459,31.168077 16.039062,30.125 8.8951327,28.907681 2.2613142,23.279376 1.6835938,15.779297 1.0769338,7.9032754 8.7225451,1.7842699 16.621094,1.7929688 Z m -0.06445,1.21875 c -3.610083,0 -7.1547995,1.4010687 -9.7304691,3.703125 C 4.2505023,9.0169002 2.6420372,12.226295 2.9199219,15.833984 3.446935,22.675712 9.4289649,28.198985 15.998047,28.914062 23.714256,29.754023 29.531603,23.3317 29.095703,15.820312 28.677948,8.6213953 23.776686,3.0117188 16.556641,3.0117188 Z m 0,0.1953124 c 7.119134,0 11.93271,5.5081373 12.345703,12.6249998 C 29.332062,23.236896 23.618958,29.545998 16.019531,28.71875 9.5454321,28.014012 3.6341637,22.555143 3.1152344,15.818359 2.8424563,12.276967 4.4184109,9.1283169 6.9570312,6.859375 9.4956516,4.5904331 12.997093,3.2070312 16.556641,3.2070312 Z m -0.07031,1.4160157 c -3.161973,0 -6.263509,1.2258139 -8.5195311,3.2421875 C 5.7107691,9.881608 4.3014542,12.694589 4.5449219,15.855469 5.0065624,21.848554 10.244178,26.686159 15.998047,27.3125 22.757013,28.048261 27.854451,22.420936 27.472656,15.841797 27.106824,9.5376025 22.81016,4.6230469 16.486328,4.6230469 Z m 0,0.1953125 c 6.22292,0 10.429946,4.8130138 10.791016,11.0351566 0.375613,6.472615 -4.617584,11.98672 -11.259766,11.263672 C 10.358685,26.501186 5.1918381,21.727985 4.7382812,15.839844 4.4999201,12.745262 5.8767315,9.9949778 8.0957031,8.0117188 10.314675,6.0284595 13.37489,4.8183594 16.486328,4.8183594 Z m -0.06836,1.4160156 c -2.713877,0 -5.376118,1.0525164 -7.3125002,2.7832031 -1.9363828,1.7306869 -3.1465517,4.1453119 -2.9375,6.8593749 0.3962699,5.14443 4.8894442,9.294429 9.8281252,9.832031 5.801749,0.631562 10.179257,-4.198828 9.851562,-9.845703 C 25.53375,10.453822 21.845616,6.234375 16.417974,6.234375 Z m 0,0.1953125 c 5.32673,0 8.925226,4.1179055 9.234375,9.4453125 0.321513,5.540351 -3.949801,10.259474 -9.634766,9.640625 C 11.173875,24.988362 6.7495143,20.900814 6.3613281,15.861328 6.1573831,13.213563 7.3350431,10.859682 9.234375,9.1621094 11.133707,7.4645372 13.754628,6.4296875 16.417969,6.4296875 Z m -0.06836,1.4160156 c -2.265775,0 -4.488729,0.8792196 -6.105468,2.3242189 -1.6167408,1.444999 -2.6277607,3.461269 -2.4531254,5.728516 0.3308986,4.295768 4.0815964,7.76012 8.2050784,8.208984 4.844525,0.52736 8.500156,-3.506097 8.226562,-8.220703 C 23.960672,11.371996 20.88106,7.8457031 16.349614,7.8457031 Z m 0,0.1953125 c 4.430534,0 7.422461,3.4227994 7.679688,7.8554684 0.267412,4.608082 -3.283978,8.532226 -8.011719,8.017578 C 11.989075,23.475538 8.3071899,20.075593 7.984375,15.884766 7.8148463,13.683819 8.7953105,11.726338 10.375,10.314453 11.954689,8.9025689 14.13437,8.0410156 16.349609,8.0410156 Z m -0.06836,1.4160156 c -1.817672,0 -3.601342,0.7039688 -4.898438,1.8632808 -1.297095,1.15931 -2.1089683,2.779185 -1.9687495,4.59961 0.2655269,3.447111 3.2737505,6.225813 6.5820315,6.585937 3.887295,0.42316 6.823008,-2.815318 6.603515,-6.597656 C 22.389541,12.288222 19.916495,9.4570311 16.28125,9.4570312 Z m 0,0.1953126 c 3.534333,0 5.917742,2.7276962 6.123047,6.2656252 0.213311,3.675814 -2.616208,6.803025 -6.386719,6.392578 -3.213298,-0.349785 -6.1507597,-3.06213 -6.408203,-6.404297 -0.1351122,-1.754127 0.644252,-3.313257 1.904297,-4.439453 1.260045,-1.126196 3.000441,-1.8144533 4.767578,-1.8144532 z m -0.07031,1.4160152 c -1.369572,0 -2.712,0.530675 -3.689454,1.404297 -0.977453,0.873622 -1.590177,2.095145 -1.484375,3.46875 0.200156,2.598452 2.4659,4.689551 4.958985,4.960938 2.93007,0.318958 5.143908,-2.122587 4.978515,-4.972656 -0.158145,-2.725244 -2.024622,-4.861329 -4.763671,-4.861329 z m 0,0.195313 c 2.638135,0 4.414975,2.034544 4.568359,4.677734 0.159211,2.743546 -1.950386,5.073824 -4.763672,4.767578 -2.398102,-0.261047 -4.591131,-2.287741 -4.783203,-4.78125 -0.100696,-1.307308 0.479519,-2.470039 1.419922,-3.310546 0.940403,-0.840508 2.239557,-1.353516 3.558594,-1.353516 z m -0.06836,1.416016 c -0.921472,0 -1.822657,0.355425 -2.480469,0.943359 -0.657811,0.587934 -1.073339,1.41501 -1.001953,2.341797 0.134785,1.749792 1.656095,3.153291 3.333985,3.335937 1.972846,0.214759 3.46676,-1.431809 3.355468,-3.349609 -0.106224,-1.830503 -1.364177,-3.271487 -3.207031,-3.271484 z m 0,0.195312 c 1.741942,0 2.912209,1.33944 3.013672,3.087891 0.10511,1.811276 -1.284562,3.346577 -3.140625,3.144531 -1.582907,-0.172307 -3.033455,-1.513355 -3.160156,-3.158203 -0.06628,-0.86049 0.314785,-1.624868 0.935547,-2.179688 0.620749,-0.554819 1.48062,-0.894531 2.351556,-0.894531 z m -0.06836,1.416016 c -0.473369,0 -0.935271,0.182129 -1.273438,0.484375 -0.338167,0.302246 -0.554546,0.730969 -0.517578,1.210937 0.06941,0.901133 0.848249,1.618981 1.710938,1.712891 1.015616,0.110557 1.789614,-0.741031 1.732421,-1.726563 -0.0543,-0.935766 -0.705691,-1.68164 -1.652343,-1.68164 z m 0,0.195312 c 0.84574,0 1.40749,0.644333 1.457031,1.498047 0.05101,0.879008 -0.616793,1.619329 -1.515625,1.521484 -0.767706,-0.08357 -1.47578,-0.738967 -1.537109,-1.535156 -0.03186,-0.413671 0.150055,-0.779697 0.451172,-1.048828 0.301116,-0.269131 0.721698,-0.435547 1.144531,-0.435547 z" />
</svg>
assets/icons/logo-concentric-jakevan.svg
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   width="32"
   height="32"
   viewBox="0 0 32 32"
   version="1.1"
   xml:space="preserve"
   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5"
   id="svg14"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"><defs
   id="defs14" />
    <path
   d="M 16.580078,2.1328125 C 8.864845,2.1328125 1.4406021,8.1466216 2.0332031,15.839844 2.5944588,23.126666 8.9712013,29.025155 15.970703,29.787109 24.221224,30.68524 30.440911,23.834277 29.974609,15.798828 29.527813,8.0998656 24.29156,2.1328125 16.580078,2.1328125 Z m 0,0.6074219 h 0.03125 V 29.232422 c -0.190323,-0.01218 -0.381521,-0.02783 -0.574219,-0.04883 C 9.3130457,28.451617 3.1778775,22.793044 2.6386719,15.792969 2.072456,8.442015 9.2081009,2.7402344 16.580078,2.7402344 Z m -0.492187,1.1445312 -0.0918,0.00391 C 12.72156,4.0183413 9.5464743,5.3646877 7.25,7.5 4.9535257,9.6353123 3.5363647,12.56498 3.7890625,15.845703 4.2808668,22.230032 9.8605879,27.383608 15.990234,28.052734 l 0.08984,0.0098 0.01953,-0.181641 -0.08984,-0.0098 C 9.9687389,27.211643 4.4549638,22.116481 3.9707031,15.830078 3.7226491,12.609644 5.1118979,9.7390477 7.375,7.6347656 9.6381021,5.5304836 12.774625,4.198197 16.003906,4.0703125 l 0.08984,-0.00391 z m 0,1.5019531 -0.0918,0.00391 C 13.128054,5.5041971 10.347434,6.6843454 8.3359375,8.5546875 6.3244411,10.42503 5.0813341,12.990827 5.3027344,15.865234 5.7335336,21.457656 10.621265,25.970548 15.990234,26.556641 l 0.08984,0.0098 0.01953,-0.179687 -0.08984,-0.0098 C 10.729419,25.800532 5.9076307,21.346056 5.484375,15.851563 5.2676184,13.037442 6.4828133,10.526812 8.4609375,8.6875 10.439062,6.8481883 13.18112,5.6840528 16.003906,5.5722656 l 0.08984,-0.00391 z m 0,1.5039063 -0.0918,0.00195 C 13.53454,6.9900663 11.1484,8.0040072 9.421875,9.609375 7.6953497,11.214743 6.6282558,13.41668 6.8183594,15.884766 7.1881551,20.685269 11.38196,24.559444 15.990234,25.0625 l 0.08984,0.0098 0.01953,-0.181641 -0.08984,-0.0098 C 11.490114,24.387477 7.3622522,20.573671 7,15.871094 6.8145401,13.463297 7.8537219,11.316525 9.546875,9.7421875 c 1.693153,-1.5743374 4.04073,-2.570326 6.457031,-2.6660156 l 0.08984,-0.00391 z m 0,1.5019531 -0.0918,0.00391 c -2.055073,0.081384 -4.046728,0.9252331 -5.488281,2.2656249 -1.4415547,1.340393 -2.3326354,3.182379 -2.1738286,5.244141 0.3063994,3.97752 3.7579646,7.174877 7.5703126,7.634766 l -0.002,0.01758 0.08789,0.0078 h 0.002 l 0.0098,0.002 0.08008,0.0098 0.02148,-0.181641 h -0.0039 v -0.002 l -0.08984,-0.0098 h -0.002 C 12.249476,22.973565 8.8168155,19.802576 8.515617,15.892571 8.361454,13.891098 9.2246225,12.10623 10.632805,10.796868 12.040985,9.4875054 13.994084,8.6577097 16.003898,8.5781177 l 0.08984,-0.00391 z m 0,1.5019532 -0.0918,0.00391 c -1.648582,0.065287 -3.245766,0.7429427 -4.402344,1.8183597 -1.156578,1.075417 -1.8716503,2.553545 -1.7441406,4.208984 0.2453946,3.18559 3.0031036,5.744381 6.0546876,6.121094 l -0.002,0.01758 0.08789,0.0078 h 0.002 l 0.08789,0.0098 h 0.002 l 0.02148,-0.18164 h -0.0039 l -0.08789,-0.0098 h -0.002 -0.002 c -2.997623,-0.328156 -5.736368,-2.860433 -5.976562,-5.978516 -0.1228659,-1.59515 0.564294,-3.018113 1.6875,-4.0625 1.123206,-1.044386 2.681833,-1.706037 4.285156,-1.769531 l 0.08984,-0.0039 z m 4.121093,1.3203127 h 1.466797 l 1.328125,3.96289 v -3.947265 h 1.103516 v 1.736328 c 0.04639,-0.08742 0.09989,-0.176212 0.160156,-0.263672 0.06031,-0.08746 0.120294,-0.169687 0.177734,-0.248047 l 0.853516,-1.224609 h 3.578125 v 0.867187 h -1.316406 v 0.626953 h 1.21875 v 0.867188 h -1.21875 v 0.753906 h 1.316406 v 0.88086 h -3.638672 l -0.804687,-1.527344 -0.326172,0.191406 v 1.335938 h -2.289063 l -0.201172,-0.748047 h -1.320312 l -0.207031,0.748047 h -1.207032 z m -2.414062,0.01563 h 1.103515 v 3.605469 c 10e-7,0.400905 -0.06117,0.722355 -0.183593,0.96289 -0.122422,0.240535 -0.290813,0.414011 -0.507813,0.521484 -0.216999,0.107513 -0.468255,0.160157 -0.753906,0.160157 -0.124256,0 -0.234465,-0.0057 -0.328125,-0.01758 -0.09366,-0.01177 -0.173578,-0.02446 -0.242188,-0.03906 V 15.58399 c 0.05936,0.01086 0.122674,0.02341 0.189454,0.03711 0.06677,0.0137 0.138936,0.02148 0.216796,0.02148 0.131676,0 0.233361,-0.02723 0.306641,-0.08008 0.07323,-0.05286 0.124617,-0.132611 0.154297,-0.238281 0.02968,-0.10567 0.04492,-0.237919 0.04492,-0.396485 z m 8.667969,0.05469 -1.244141,1.736328 1.244141,2.175782 z m -10.375,0.113282 -0.0918,0.002 c -1.242095,0.04919 -2.4448,0.560652 -3.316406,1.371093 -0.871608,0.810442 -1.41262,1.924712 -1.316407,3.173829 0.18439,2.393654 2.250195,4.312022 4.541016,4.605468 l -0.002,0.01758 0.08789,0.0078 h 0.002 l 0.08789,0.0098 h 0.002 l 0.01953,-0.179687 h -0.002 v -0.002 l -0.07813,-0.0078 -0.0098,-0.002 h -0.002 -0.002 c -2.236961,-0.245121 -4.2837,-2.136731 -4.46289,-4.46289 -0.09157,-1.188826 0.421531,-2.247933 1.259766,-3.027344 0.838234,-0.779411 2.002382,-1.272916 3.199218,-1.320313 l 0.08984,-0.0039 z m 4.861328,0.474609 c -0.01671,0.09111 -0.03972,0.203928 -0.07031,0.337891 -0.0306,0.133922 -0.06128,0.265269 -0.09375,0.396484 -0.03242,0.131175 -0.06185,0.240665 -0.08594,0.328125 l -0.175782,0.65625 h 0.865235 l -0.173828,-0.65625 c -0.01851,-0.07106 -0.04681,-0.172529 -0.08203,-0.304688 -0.03526,-0.132118 -0.06921,-0.268935 -0.103515,-0.410156 -0.0343,-0.141221 -0.06153,-0.256546 -0.08008,-0.347656 z m -4.861328,1.027344 -0.0918,0.0039 c -0.835608,0.03309 -1.643836,0.374456 -2.230469,0.919922 -0.586633,0.545466 -0.951635,1.299786 -0.886719,2.142578 0.123205,1.599378 1.498128,2.859467 3.025391,3.072265 l -0.0039,0.0332 0.08984,0.0098 0.08203,0.0078 0.0078,0.002 h 0.002 l 0.01953,-0.181641 h -0.002 l -0.08789,-0.0098 h -0.002 -0.002 c -1.476337,-0.162041 -2.829076,-1.412996 -2.947265,-2.947266 -0.06027,-0.782503 0.276817,-1.479705 0.830078,-1.994141 0.553261,-0.514435 1.322933,-0.841748 2.113281,-0.873046 l 0.08984,-0.0039 z m 0,1.501953 -0.0918,0.0039 c -0.429118,0.01699 -0.842873,0.192166 -1.144531,0.472656 -0.30166,0.280491 -0.490648,0.670955 -0.457032,1.107422 0.06219,0.80736 0.743801,1.430257 1.509766,1.558594 l -0.0039,0.0332 0.08984,0.0078 h 0.002 l 0.08789,0.0098 0.02148,-0.179687 h -0.002 v -0.002 l -0.07813,-0.0078 -0.0098,-0.002 h -0.002 -0.002 c -0.715675,-0.07901 -1.374455,-0.68929 -1.43164,-1.431641 -0.02897,-0.376179 0.132104,-0.711477 0.400391,-0.960937 0.268286,-0.249461 0.643485,-0.408627 1.027343,-0.423828 l 0.08984,-0.0039 z m 7.041015,0.849609 h 1.261719 l 1.142578,3.414063 v -3.400391 h 1.236328 l 1.275391,2.392578 h 0.01367 c -0.0047,-0.07537 -0.0089,-0.164032 -0.01367,-0.263672 -0.0048,-0.09964 -0.0097,-0.200713 -0.01367,-0.302734 -0.004,-0.10202 -0.0059,-0.191051 -0.0059,-0.269531 v -1.556641 h 0.84375 v 3.441406 h -1.242188 l -1.279297,-2.423828 h -0.02148 c 0.008,0.07377 0.01508,0.162088 0.02148,0.265625 0.0064,0.103579 0.01288,0.208891 0.01758,0.316406 0.0048,0.107474 0.0078,0.204706 0.0078,0.291016 v 1.550781 H 24.513672 L 24.339844,18.0625 h -1.136719 l -0.177734,0.644531 h -1.039063 z m -4.154297,0.01367 h 1.0625 l 0.476563,1.744141 c 0.01754,0.06589 0.03937,0.151107 0.0625,0.253906 0.02317,0.102758 0.04448,0.204661 0.06445,0.30664 0.01997,0.10202 0.03231,0.18562 0.03711,0.25 0.0064,-0.06438 0.01761,-0.147625 0.03516,-0.248046 0.01759,-0.100421 0.03704,-0.201535 0.05859,-0.302735 0.0216,-0.101241 0.04138,-0.18406 0.06055,-0.25 l 0.486328,-1.753906 h 1.060547 l -1.148437,3.441406 h -1.113282 z m 4.791016,0.552734 c -0.01429,0.07844 -0.03421,0.175669 -0.06055,0.291016 -0.02634,0.115347 -0.05406,0.230782 -0.08203,0.34375 -0.02793,0.112969 -0.05147,0.20592 -0.07227,0.28125 l -0.152344,0.564453 h 0.746094 l -0.15039,-0.564453 c -0.01592,-0.06122 -0.03988,-0.147971 -0.07031,-0.261719 -0.03027,-0.113789 -0.06029,-0.231935 -0.08984,-0.353515 -0.02956,-0.12162 -0.05235,-0.222342 -0.06836,-0.300782 z m -3.646484,2.992188 H 20.5625 c 0.174775,0 0.320658,0.02964 0.439453,0.08984 0.118754,0.0602 0.210255,0.148556 0.271484,0.265625 0.06127,0.117069 0.0918,0.261864 0.0918,0.433593 0,0.179807 -0.03301,0.3313 -0.09766,0.453125 -0.06461,0.121826 -0.160477,0.213761 -0.287109,0.275391 -0.12659,0.06167 -0.283965,0.0918 -0.470703,0.0918 H 20.11914 Z m 1.435546,0 h 0.896485 v 0.101562 h -0.78125 v 0.611328 H 22.40625 V 19.625 h -0.736328 v 0.693359 h 0.78125 v 0.101563 h -0.896485 z m 1.083985,0 h 0.398437 c 0.130008,0 0.237229,0.01309 0.324219,0.04102 0.08703,0.02788 0.153166,0.07478 0.197266,0.138672 0.04402,0.06384 0.06641,0.149191 0.06641,0.257813 0,0.08148 -0.01462,0.152587 -0.04492,0.210937 -0.0303,0.05835 -0.07202,0.105178 -0.125,0.142578 -0.0531,0.03748 -0.114154,0.06613 -0.183594,0.08594 l 0.449219,0.732422 H 23.58399 l -0.423828,-0.699219 h -0.40625 v 0.699219 h -0.115234 z m 1.007812,0 h 0.119141 l 0.308594,1.134765 c 0.0081,0.03009 0.01438,0.05879 0.02148,0.08594 0.007,0.02715 0.01353,0.05281 0.01953,0.07813 0.006,0.02534 0.01198,0.05035 0.01758,0.07422 0.0056,0.02383 0.01112,0.04804 0.01563,0.07227 0.0052,-0.02424 0.01043,-0.04925 0.01563,-0.07422 0.0052,-0.02493 0.01128,-0.04855 0.01758,-0.07422 0.0064,-0.02571 0.01233,-0.05256 0.01953,-0.08008 0.007,-0.02752 0.01639,-0.05779 0.02539,-0.08789 l 0.320313,-1.128906 h 0.115234 l 0.333985,1.136719 c 0.009,0.03153 0.01799,0.05997 0.02539,0.08789 0.0075,0.02789 0.01353,0.05474 0.01953,0.08008 0.0059,0.0253 0.01228,0.05035 0.01758,0.07422 0.0052,0.02383 0.01043,0.04808 0.01563,0.07227 0.006,-0.03301 0.01118,-0.06572 0.01758,-0.09766 0.0063,-0.0319 0.01444,-0.06439 0.02344,-0.09961 0.009,-0.03526 0.02,-0.07537 0.03125,-0.117187 l 0.314453,-1.136719 h 0.119141 l -0.447266,1.609375 h -0.111328 l -0.351562,-1.214844 c -0.0083,-0.02567 -0.01508,-0.05109 -0.02148,-0.07422 -0.0063,-0.02313 -0.01188,-0.04354 -0.01758,-0.06445 -0.0056,-0.02092 -0.01073,-0.04185 -0.01563,-0.06055 -0.0048,-0.01869 -0.0087,-0.0354 -0.01172,-0.05078 -0.0029,0.01538 -0.0064,0.03161 -0.0098,0.04883 -0.0034,0.01726 -0.0072,0.03438 -0.01172,0.05273 -0.0045,0.01833 -0.0084,0.03874 -0.01367,0.05859 -0.0052,0.01981 -0.01158,0.03927 -0.01758,0.06055 l -0.349609,1.244141 h -0.113281 z m 2.035157,0 h 0.896484 v 0.101562 h -0.779297 v 0.611328 h 0.736328 V 19.625 h -0.736328 v 0.693359 h 0.779297 v 0.101563 h -0.896484 z m 1.083984,0 h 0.398437 c 0.129926,0 0.239142,0.01309 0.326172,0.04102 0.08699,0.02788 0.151213,0.07478 0.195313,0.138672 0.04402,0.06384 0.06641,0.149191 0.06641,0.257813 0,0.08148 -0.01462,0.152587 -0.04492,0.210937 -0.03026,0.05835 -0.07202,0.105178 -0.125,0.142578 -0.05306,0.03748 -0.114153,0.06613 -0.183594,0.08594 l 0.449219,0.732422 h -0.136719 l -0.421875,-0.699219 h -0.408203 v 0.699219 h -0.115234 z m 1.181641,0 h 0.896484 v 0.101562 H 28.0625 v 0.6875 h 0.738281 v 0.09961 H 28.0625 v 0.720703 h -0.115234 z m -7.712891,0.09961 v 1.410156 h 0.271484 c 0.247261,0 0.432183,-0.0604 0.554688,-0.179687 0.122549,-0.119242 0.183594,-0.298542 0.183594,-0.537109 0,-0.153358 -0.02536,-0.280054 -0.07617,-0.382813 -0.05077,-0.102758 -0.129793,-0.180672 -0.234375,-0.232422 -0.104582,-0.05171 -0.235882,-0.07813 -0.396485,-0.07813 z m 2.519531,0 v 0.708985 h 0.326172 c 0.13376,0 0.23747,-0.03064 0.3125,-0.09375 0.07516,-0.06315 0.113281,-0.15335 0.113281,-0.271485 0,-0.129944 -0.03998,-0.220321 -0.11914,-0.269531 -0.07924,-0.04917 -0.199224,-0.07422 -0.361328,-0.07422 z m 4.126953,0 v 0.708985 h 0.326172 c 0.133759,0 0.239423,-0.03064 0.314453,-0.09375 0.07512,-0.06315 0.111328,-0.15335 0.111328,-0.271485 0,-0.129944 -0.03808,-0.220321 -0.117187,-0.269531 -0.07924,-0.04917 -0.201178,-0.07422 -0.363281,-0.07422 z"
   style="baseline-shift:baseline;clip-rule:nonzero;display:inline;overflow:visible;vector-effect:none;fill:#222222;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
   id="path17" />
</svg>
assets/icons/logo-concentric.svg
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   width="32"
   height="32"
   viewBox="0 0 32 32"
   version="1.1"
   xml:space="preserve"
   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5"
   id="svg14"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"><defs
   id="defs14" />
    <path
   d="M 16.580078,2.1328125 C 8.8648449,2.1328125 1.4406021,8.1466218 2.0332031,15.839844 2.5944588,23.126666 8.9712012,29.025155 15.970703,29.787109 24.221224,30.68524 30.440911,23.834277 29.974609,15.798828 29.527813,8.0998655 24.29156,2.1328125 16.580078,2.1328125 Z m 0,0.6074219 c 0.01046,0 0.02083,0 0.03125,0 V 29.232422 c -0.190323,-0.01218 -0.381521,-0.02783 -0.574219,-0.04883 C 9.3130453,28.451615 3.1778775,22.793044 2.6386719,15.792969 2.072456,8.4420153 9.2081008,2.7402344 16.580078,2.7402344 Z M 16.091797,3.8847656 16,3.8886719 C 12.725454,4.0183489 9.5523379,5.3646838 7.2558594,7.5 4.9593809,9.6353162 3.5402703,12.564972 3.7929688,15.845703 4.2847739,22.230045 9.8644812,27.383606 15.994141,28.052734 l 0.08984,0.0098 0.02148,-0.181641 -0.0918,-0.0098 C 9.9726749,27.211644 4.4588691,22.116468 3.9746094,15.830078 3.7265559,12.609651 5.1158084,9.7390437 7.3789062,7.6347656 9.6420041,5.5304875 12.778539,4.1981968 16.007812,4.0703125 l 0.0918,-0.00391 z m 0,1.5019531 L 16,5.390625 C 13.131949,5.5042047 10.353298,6.6843415 8.3417969,8.5546875 6.3302962,10.425033 5.0871929,12.990819 5.3085937,15.865234 5.739394,21.457669 10.625161,25.970547 15.994141,26.556641 l 0.08984,0.0098 0.02148,-0.179687 -0.0918,-0.0098 C 10.733354,25.800533 5.9134892,21.346046 5.4902344,15.851563 5.2734784,13.037451 6.4867237,10.526808 8.4648438,8.6875 10.442964,6.8481922 13.185032,5.6840526 16.007812,5.5722656 l 0.0918,-0.00391 z m 0,1.5039063 L 16,6.8925781 c -2.461577,0.097483 -4.845728,1.1114174 -6.5722656,2.7167969 -1.726538,1.60538 -2.7955741,3.807282 -2.6054688,6.275391 0.3697986,4.80054 4.5635334,8.674674 9.1718754,9.177734 l 0.08984,0.0098 0.02148,-0.181641 -0.0918,-0.0098 C 11.494037,24.387481 7.3661557,20.573634 7.0039062,15.871094 6.8184481,13.46332 7.8576405,11.316513 9.5507813,9.7421875 11.243922,8.1678618 13.591529,7.1718608 16.007812,7.0761719 l 0.0918,-0.00391 z m 0,1.5019531 L 16,8.3964844 c -2.055073,0.081384 -4.044775,0.9252334 -5.486328,2.2656246 -1.4415535,1.340393 -2.3345881,3.182379 -2.1757814,5.244141 0.308792,4.008579 3.8086054,7.240136 7.6562504,7.660156 l 0.08984,0.0098 0.0078,-0.06836 v -0.002 l 0.002,-0.0098 c 9.49e-4,-0.0034 0.0035,-0.0062 0.0039,-0.0098 6.42e-4,-0.0067 8.02e-4,-0.01301 0,-0.01953 l 0.0078,-0.07227 -0.0918,-0.0098 C 12.254667,22.974422 8.8207796,19.803231 8.5195313,15.892578 8.3653682,13.891105 9.2285373,12.106237 10.636719,10.796875 12.0449,9.487513 13.997999,8.657717 16.007812,8.578125 l 0.0918,-0.00391 z m 0,1.5019532 L 16,9.8984375 c -1.648588,0.065287 -3.245761,0.7429385 -4.402344,1.8183595 -1.156582,1.075421 -1.8716506,2.553538 -1.7441404,4.208984 0.2477884,3.216669 3.0536414,5.809501 6.1406254,6.146485 l 0.08984,0.0098 0.02148,-0.18164 -0.0918,-0.0098 c -2.998344,-0.327308 -5.738273,-2.859798 -5.978516,-5.978516 -0.1228645,-1.595142 0.564298,-3.018117 1.6875,-4.0625 1.123202,-1.044382 2.681839,-1.706037 4.285156,-1.769531 l 0.0918,-0.0039 z m 0,1.5039067 -0.0918,0.002 c -1.242095,0.04919 -2.4448,0.560652 -3.316406,1.371093 -0.871606,0.810442 -1.412619,1.924713 -1.316406,3.173829 0.186783,2.424732 2.300643,4.376913 4.626953,4.630859 l 0.08984,0.0098 0.02148,-0.18164 -0.0918,-0.0098 c -2.237692,-0.244272 -4.285604,-2.136083 -4.464844,-4.46289 -0.09157,-1.188826 0.421532,-2.247933 1.259766,-3.027344 0.838234,-0.779411 2.002383,-1.272916 3.199218,-1.320313 l 0.0918,-0.0039 z m 0,1.501953 -0.0918,0.0039 c -0.835613,0.03309 -1.643831,0.374452 -2.230469,0.919922 -0.586637,0.54547 -0.951636,1.299778 -0.886718,2.142578 0.12578,1.632821 1.545673,2.94237 3.111328,3.113281 -0.0026,-2.8e-4 -0.0053,2.86e-4 -0.0078,0 0.003,6.03e-4 0.0066,0.0017 0.0098,0.002 0.0031,3.08e-4 0.0067,1.2e-5 0.0098,0 l 0.07813,0.0098 0.02148,-0.181641 -0.0918,-0.0098 c -1.477015,-0.161235 -2.830984,-1.412396 -2.949219,-2.947266 -0.06027,-0.782496 0.276822,-1.479709 0.830078,-1.994141 0.553257,-0.514431 1.322939,-0.841748 2.113281,-0.873046 l 0.0918,-0.0039 z m 0,1.501953 L 16,14.40625 c -0.429117,0.01699 -0.842873,0.192166 -1.144531,0.472656 -0.301659,0.280491 -0.490648,0.670955 -0.457031,1.107422 0.06477,0.840886 0.790729,1.511732 1.595703,1.599609 l 0.08984,0.0098 0.02148,-0.181641 -0.0918,-0.0098 c -0.716357,-0.0782 -1.376362,-0.688681 -1.433594,-1.431641 -0.02897,-0.376179 0.132105,-0.711477 0.400391,-0.960937 0.268286,-0.249461 0.643485,-0.408627 1.027343,-0.423828 l 0.0918,-0.0039 z"
   style="baseline-shift:baseline;clip-rule:nonzero;display:inline;overflow:visible;vector-effect:none;fill:#222222;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
   id="path27" />
</svg>
assets/icons/logo-right-aligned-jakevan.svg
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   width="32"
   height="32"
   viewBox="0 0 32 32"
   version="1.1"
   xml:space="preserve"
   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5"
   id="svg10"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"><defs
   id="defs10" />
    <path
   d="M 16.580078,2.1328125 C 8.8648449,2.1328125 1.4406021,8.1466218 2.0332031,15.839844 2.5944588,23.126666 8.9712012,29.025155 15.970703,29.787109 24.221224,30.68524 30.440911,23.834277 29.974609,15.798828 29.527813,8.0998655 24.29156,2.1328125 16.580078,2.1328125 Z m 0,0.6074219 h 0.03125 V 29.232422 c -0.190323,-0.01218 -0.381521,-0.02783 -0.574219,-0.04883 C 9.3130453,28.451615 3.1778775,22.793044 2.6386719,15.792969 2.072456,8.4420153 9.2081008,2.7402344 16.580078,2.7402344 Z m -0.496094,0.2441406 -0.0918,0.00781 c -3.360804,0.2797271 -6.5752134,1.7513778 -8.8886724,4 -2.3134469,2.2486297 -3.7253207,5.278537 -3.4648397,8.660159 0.5058853,6.567331 6.0825465,11.909552 12.3476561,12.884765 l 0.08984,0.01367 0.02734,-0.18164 -0.08984,-0.01367 C 9.8324118,27.393308 4.3188859,22.111081 3.8203125,15.638672 3.5643426,12.315613 4.949063,9.3405142 7.2304687,7.1230469 9.5118745,4.9055796 12.690192,3.4499613 16.007812,3.1738281 l 0.08984,-0.00781 z m -0.0059,0.8339844 -0.0918,0.013672 C 9.9798928,4.695654 4.6864545,9.5629495 5.15625,15.662109 c 0.4546562,5.902443 5.258519,10.752462 10.824219,11.980469 l 0.08984,0.01953 0.03906,-0.177734 -0.08984,-0.01953 C 10.530979,26.253857 5.7855712,21.460319 5.3378906,15.648438 4.8767306,9.6613868 10.087727,4.8637642 16.013672,4.0117187 l 0.08984,-0.013672 z m -0.0078,0.8886718 -0.08984,0.019531 C 10.70938,5.8501602 6.2534845,10.240426 6.67185,15.671875 c 0.4031086,5.233074 4.452576,9.583681 9.302734,11.017578 l 0.08789,0.02539 0.05078,-0.173828 -0.08789,-0.02539 C 11.244982,25.102344 7.2500324,20.805703 6.8535156,15.658203 6.4433459,10.333156 10.822595,6.0120941 16.019531,4.9042969 l 0.08789,-0.017578 z m -0.0078,0.9570313 -0.08789,0.027344 C 11.46198,7.0228927 7.8229814,10.924018 8.1894381,15.681641 c 0.3509983,4.556464 3.6609319,8.396522 7.7773439,9.980468 l 0.08594,0.0332 0.06445,-0.169921 -0.08398,-0.0332 C 11.978398,23.931948 8.7159442,20.144628 8.3710938,15.667969 8.012325,11.01016 11.579907,7.1769128 16.025391,5.8652344 l 0.08789,-0.025391 z m -0.01172,1.0449219 -0.08398,0.035156 c -3.727283,1.4762169 -6.5754769,4.8757646 -6.2617189,8.9492186 0.2979729,3.868073 2.8922249,7.17822 6.2539059,8.84375 l 0.08203,0.04102 0.08203,-0.164063 -0.08203,-0.03906 C 12.732087,22.735595 10.181025,19.47286 9.8886719,15.677734 9.5820005,11.696284 12.365382,8.3647763 16.033203,6.9121094 l 0.08594,-0.033203 z M 16.037109,7.875 15.957029,7.917969 c -2.909987,1.5410877 -4.994006,4.414317 -4.734375,7.785156 0.243357,3.159275 2.145826,5.916634 4.728516,7.576172 l 0.07617,0.04883 0.09961,-0.154297 -0.07813,-0.04883 c -2.53964,-1.63188 -4.406142,-4.340768 -4.644531,-7.435547 -0.253285,-3.288437 1.779573,-6.0952367 4.638672,-7.6093746 l 0.08008,-0.042969 z m -0.01758,1.3515625 -0.07226,0.052734 c -2.053134,1.4973275 -3.409815,3.8008975 -3.207032,6.4335945 0.185778,2.411781 1.425922,4.568675 3.201172,6.101562 l 0.06836,0.05859 0.11914,-0.136719 -0.06836,-0.06055 c -1.743007,-1.505052 -2.957026,-3.618423 -3.138672,-5.976562 -0.197383,-2.562592 1.120588,-4.803991 3.132812,-6.271485 l 0.07227,-0.054687 z m -0.02734,1.6953125 -0.06055,0.06641 c -1.143017,1.280256 -1.815322,2.922689 -1.675782,4.734375 0.121327,1.575008 0.737395,3.030665 1.671875,4.242188 l 0.05664,0.07227 0.142578,-0.111328 -0.05469,-0.07227 c -0.914999,-1.18628 -1.516403,-2.607999 -1.634766,-4.144532 -0.13546,-1.758709 0.515678,-3.348577 1.630859,-4.597656 l 0.06055,-0.06836 z m 4.216796,0.292969 h 1.466797 l 1.328125,3.96289 v -3.947265 h 1.103516 v 1.736328 c 0.04639,-0.08742 0.09989,-0.176212 0.160156,-0.263672 0.06031,-0.08746 0.120294,-0.169687 0.177734,-0.248047 l 0.853516,-1.224609 h 3.578125 v 0.867187 h -1.316406 v 0.626953 h 1.21875 v 0.867188 h -1.21875 v 0.753906 h 1.316406 v 0.88086 h -3.638672 l -0.804687,-1.527344 -0.326172,0.191406 v 1.335938 H 21.81836 l -0.201172,-0.748047 h -1.320312 l -0.207031,0.748047 h -1.207032 z m -2.414062,0.01563 h 1.103515 v 3.605469 c 1e-6,0.400905 -0.06117,0.722355 -0.183593,0.96289 -0.122422,0.240535 -0.290813,0.41401 -0.507813,0.521484 -0.216999,0.107513 -0.468255,0.160157 -0.753906,0.160157 -0.124256,0 -0.234465,-0.0057 -0.328125,-0.01758 -0.09366,-0.01177 -0.173578,-0.02446 -0.242188,-0.03906 V 15.58399 c 0.05936,0.01086 0.122674,0.02341 0.189454,0.03711 0.06677,0.0137 0.138936,0.02148 0.216796,0.02148 0.131676,0 0.233361,-0.02723 0.306641,-0.08008 0.07323,-0.05286 0.124617,-0.132611 0.154297,-0.238281 0.02968,-0.10567 0.04492,-0.237919 0.04492,-0.396485 z m 8.667969,0.05469 -1.244141,1.736328 1.244141,2.175782 z m -5.513672,0.587891 c -0.01671,0.09111 -0.03972,0.203928 -0.07031,0.337891 -0.0306,0.133923 -0.06128,0.265269 -0.09375,0.396484 -0.03242,0.131175 -0.06185,0.240665 -0.08594,0.328125 l -0.175782,0.65625 h 0.865235 l -0.173828,-0.65625 c -0.01851,-0.07106 -0.04681,-0.172529 -0.08203,-0.304688 -0.03526,-0.132118 -0.06921,-0.268935 -0.103515,-0.410156 -0.0343,-0.141221 -0.06153,-0.256546 -0.08008,-0.347656 z m -5.015625,2.058594 -0.02149,0.08789 c -0.132905,0.545109 -0.184404,1.119146 -0.138671,1.712891 0.02435,0.316053 0.06996,0.62746 0.136718,0.93164 l 0.01953,0.08789 0.179687,-0.03906 -0.01953,-0.08789 c -0.06498,-0.29608 -0.111074,-0.598759 -0.134766,-0.90625 -0.04425,-0.574493 0.0043,-1.129325 0.132813,-1.65625 l 0.02148,-0.08789 z m 7.195312,1.320312 h 1.261719 l 1.142578,3.414063 v -3.400391 h 1.236328 l 1.275391,2.392578 h 0.01367 c -0.0047,-0.07537 -0.0089,-0.164032 -0.01367,-0.263672 -0.0048,-0.09964 -0.0097,-0.200713 -0.01367,-0.302734 -0.004,-0.10202 -0.0059,-0.191051 -0.0059,-0.269531 v -1.556641 h 0.84375 v 3.441406 h -1.242188 l -1.279297,-2.423828 h -0.02148 c 0.008,0.07377 0.01508,0.162088 0.02148,0.265625 0.0064,0.103579 0.01288,0.208891 0.01758,0.316406 0.0048,0.107474 0.0078,0.204706 0.0078,0.291016 v 1.550781 H 24.513672 L 24.339844,18.0625 h -1.136719 l -0.177734,0.644531 h -1.039063 z m -4.154297,0.01367 h 1.0625 l 0.476563,1.744141 c 0.01754,0.06589 0.03937,0.151107 0.0625,0.253906 0.02317,0.102758 0.04448,0.204661 0.06445,0.30664 0.01997,0.10202 0.03231,0.18562 0.03711,0.25 0.0064,-0.06438 0.01761,-0.147625 0.03516,-0.248046 0.01759,-0.100421 0.03704,-0.201535 0.05859,-0.302735 0.0216,-0.101241 0.04138,-0.18406 0.06055,-0.25 l 0.486328,-1.753906 h 1.060547 l -1.148437,3.441406 h -1.113282 z m 4.791016,0.552734 c -0.01429,0.07844 -0.03421,0.175669 -0.06055,0.291016 -0.02634,0.115347 -0.05406,0.230782 -0.08203,0.34375 -0.02793,0.112969 -0.05147,0.20592 -0.07227,0.28125 l -0.152344,0.564453 h 0.746094 l -0.15039,-0.564453 c -0.01592,-0.06122 -0.03988,-0.147971 -0.07031,-0.261719 -0.03027,-0.113789 -0.06029,-0.231935 -0.08984,-0.353515 -0.02956,-0.12162 -0.05235,-0.222342 -0.06836,-0.300782 z m -3.646484,2.992188 H 20.5625 c 0.174775,0 0.320658,0.02964 0.439453,0.08984 0.118754,0.0602 0.210255,0.148556 0.271484,0.265625 0.06127,0.117069 0.0918,0.261864 0.0918,0.433593 0,0.179807 -0.03301,0.3313 -0.09766,0.453125 -0.06461,0.121826 -0.160477,0.213761 -0.287109,0.275391 -0.12659,0.06167 -0.283965,0.0918 -0.470703,0.0918 H 20.11914 Z m 1.435546,0 h 0.896485 v 0.101562 h -0.78125 v 0.611328 H 22.40625 V 19.625 h -0.736328 v 0.693359 h 0.78125 v 0.101563 h -0.896485 z m 1.083985,0 h 0.398437 c 0.130008,0 0.237229,0.01309 0.324219,0.04102 0.08703,0.02788 0.153166,0.07478 0.197266,0.138672 0.04402,0.06384 0.06641,0.149191 0.06641,0.257813 0,0.08148 -0.01462,0.152587 -0.04492,0.210937 -0.0303,0.05835 -0.07202,0.105178 -0.125,0.142578 -0.0531,0.03748 -0.114154,0.06613 -0.183594,0.08594 l 0.449219,0.732422 h -0.136719 l -0.423828,-0.699219 h -0.40625 v 0.699219 h -0.115234 z m 1.007812,0 h 0.119141 l 0.308594,1.134765 c 0.0081,0.03009 0.01438,0.05879 0.02148,0.08594 0.007,0.02715 0.01353,0.05282 0.01953,0.07813 0.006,0.02534 0.01198,0.05035 0.01758,0.07422 0.0056,0.02383 0.01112,0.04804 0.01563,0.07227 0.0052,-0.02424 0.01043,-0.04925 0.01563,-0.07422 0.0052,-0.02493 0.01128,-0.04855 0.01758,-0.07422 0.0064,-0.02571 0.01233,-0.05256 0.01953,-0.08008 0.007,-0.02752 0.01639,-0.05779 0.02539,-0.08789 l 0.320313,-1.128906 h 0.115234 l 0.333985,1.136719 c 0.009,0.03153 0.01799,0.05997 0.02539,0.08789 0.0075,0.02789 0.01353,0.05474 0.01953,0.08008 0.0059,0.0253 0.01228,0.05035 0.01758,0.07422 0.0052,0.02383 0.01043,0.04808 0.01563,0.07227 0.006,-0.03301 0.01118,-0.06572 0.01758,-0.09766 0.0063,-0.0319 0.01444,-0.06439 0.02344,-0.09961 0.009,-0.03526 0.02,-0.07537 0.03125,-0.117187 l 0.314453,-1.136719 h 0.119141 L 25.13283,20.41994 H 25.021502 L 24.66994,19.205096 c -0.0083,-0.02567 -0.01508,-0.05109 -0.02148,-0.07422 -0.0063,-0.02313 -0.01188,-0.04354 -0.01758,-0.06445 -0.0056,-0.02092 -0.01073,-0.04185 -0.01563,-0.06055 -0.0048,-0.01869 -0.0087,-0.0354 -0.01172,-0.05078 -0.0029,0.01538 -0.0064,0.03161 -0.0098,0.04883 -0.0034,0.01726 -0.0072,0.03437 -0.01172,0.05273 -0.0045,0.01833 -0.0084,0.03874 -0.01367,0.05859 -0.0052,0.01981 -0.01158,0.03927 -0.01758,0.06055 l -0.349609,1.244141 H 24.08787 Z m 2.035157,0 h 0.896484 v 0.101562 h -0.779297 v 0.611328 h 0.736328 V 19.625 h -0.736328 v 0.693359 h 0.779297 v 0.101563 h -0.896484 z m 1.083984,0 h 0.398437 c 0.129926,0 0.239142,0.01309 0.326172,0.04102 0.08699,0.02788 0.151213,0.07478 0.195313,0.138672 0.04402,0.06384 0.06641,0.149191 0.06641,0.257813 0,0.08148 -0.01462,0.152587 -0.04492,0.210937 -0.03026,0.05835 -0.07202,0.105178 -0.125,0.142578 -0.05306,0.03748 -0.114154,0.06613 -0.183594,0.08594 l 0.449219,0.732422 h -0.136719 l -0.421875,-0.699219 h -0.408203 v 0.699219 h -0.115234 z m 1.181641,0 h 0.896484 v 0.101562 H 28.0625 v 0.6875 h 0.738281 v 0.09961 H 28.0625 v 0.720703 h -0.115234 z m -7.712891,0.09961 v 1.410156 h 0.271484 c 0.247261,0 0.432183,-0.0604 0.554688,-0.179687 0.122549,-0.119242 0.183594,-0.298542 0.183594,-0.537109 0,-0.153358 -0.02536,-0.280054 -0.07617,-0.382813 -0.05077,-0.102758 -0.129793,-0.180672 -0.234375,-0.232422 -0.104582,-0.05171 -0.235882,-0.07813 -0.396485,-0.07813 z m 2.519531,0 v 0.708985 h 0.326172 c 0.13376,0 0.23747,-0.03064 0.3125,-0.09375 0.07516,-0.06315 0.113281,-0.15335 0.113281,-0.271485 0,-0.129944 -0.03998,-0.220321 -0.11914,-0.269531 -0.07924,-0.04917 -0.199224,-0.07422 -0.361328,-0.07422 z m 4.126953,0 v 0.708985 h 0.326172 c 0.133759,0 0.239423,-0.03064 0.314453,-0.09375 0.07512,-0.06315 0.111328,-0.15335 0.111328,-0.271485 0,-0.129944 -0.03808,-0.220321 -0.117187,-0.269531 -0.07924,-0.04917 -0.201178,-0.07422 -0.363281,-0.07422 z"
   style="baseline-shift:baseline;clip-rule:nonzero;display:inline;overflow:visible;vector-effect:none;fill:#222222;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
   id="path19" />
</svg>
assets/icons/logo-right-aligned.svg
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   width="32"
   height="32"
   viewBox="0 0 32 32"
   version="1.1"
   xml:space="preserve"
   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5"
   id="svg10"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"><defs
   id="defs10" />
    <path
   id="path11"
   style="clip-rule:nonzero;fill:#222222;fill-rule:nonzero;stroke-linecap:butt;stroke-linejoin:miter"
   d="M 16.580078,2.1328125 C 8.864845,2.1328125 1.4406021,8.1466216 2.0332031,15.839844 2.5944588,23.126666 8.9712013,29.025155 15.970703,29.787109 24.221224,30.68524 30.440911,23.834277 29.974609,15.798828 29.527813,8.0998656 24.29156,2.1328125 16.580078,2.1328125 Z m 0,0.6074219 h 0.03125 V 29.232422 c -0.190323,-0.01218 -0.381521,-0.02783 -0.574219,-0.04883 C 9.3130457,28.451617 3.1778775,22.793044 2.6386719,15.792969 2.072456,8.442015 9.2081009,2.7402344 16.580078,2.7402344 Z m -0.492187,0.2441406 -0.0918,0.00781 c -3.360778,0.279725 -6.5752313,1.7513954 -8.8886721,4 -2.3134319,2.2486121 -3.7253191,5.27857 -3.4648408,8.660159 0.5058813,6.567277 6.0825943,11.907606 12.3476559,12.882812 l 0.08984,0.01563 0.02734,-0.179687 -0.08984,-0.01563 C 9.8362859,27.393301 4.3227963,22.111134 3.8242188,15.638672 3.5682463,12.31558 4.9529511,9.3405318 7.234375,7.1230469 9.5157989,4.905562 12.694072,3.4499633 16.011719,3.1738281 l 0.08984,-0.00781 z m -0.0059,0.8339844 -0.08984,0.013672 C 9.9858192,4.6956504 4.6903636,9.5629845 5.1601562,15.662109 5.6148104,21.564524 10.4187,26.414576 15.984375,27.642578 l 0.08984,0.01953 0.03906,-0.177734 -0.08984,-0.01953 C 10.534864,26.253852 5.7894797,21.460349 5.3417969,15.648438 4.8806342,9.6613517 10.091609,4.8637678 16.017578,4.0117188 l 0.08984,-0.013672 z m -0.0078,0.8886718 -0.08984,0.019531 C 10.713379,5.8501575 6.2574174,10.240446 6.6757812,15.671875 7.0788887,20.904933 11.128371,25.25556 15.978516,26.689453 l 0.08789,0.02539 0.05078,-0.173828 -0.08789,-0.02539 C 11.24886,25.10234 7.2539399,20.805719 6.8574219,15.658203 6.4472506,10.333136 10.826488,6.012097 16.023438,4.9042969 l 0.08789,-0.017578 z m -0.0078,0.9570313 -0.08789,0.027344 c -4.512594,1.33148 -8.1516109,5.2326425 -7.7851566,9.9902345 0.3509963,4.55644 3.6609516,8.396529 7.7773436,9.980468 l 0.08594,0.0332 0.06445,-0.169921 -0.08398,-0.0332 C 11.982316,23.931941 8.7198525,20.144653 8.375,15.667969 8.0162291,11.010129 11.583793,7.176919 16.029297,5.8652344 l 0.08789,-0.025391 z m -0.01172,1.0449219 -0.08398,0.035156 C 12.243442,8.220344 9.3971715,11.619957 9.7109255,15.693359 c 0.2979705,3.868032 2.8903015,7.178234 6.2519535,8.84375 l 0.08203,0.04102 0.08203,-0.164063 -0.08203,-0.03906 C 12.735992,22.73558 10.184935,19.472901 9.8925781,15.677734 9.5859027,11.696232 12.369254,8.3647896 16.037109,6.9121094 l 0.08594,-0.033203 z M 16.042969,7.875 15.960939,7.917969 c -2.90996,1.5410724 -4.994003,4.414363 -4.734376,7.785156 0.243355,3.159239 2.14585,5.91665 4.728516,7.576172 l 0.07617,0.04883 0.09961,-0.154297 -0.07813,-0.04883 C 13.513072,21.493104 11.646595,18.784269 11.408203,15.689453 11.154915,12.40097 13.187747,9.5942312 16.046875,8.0800781 l 0.08008,-0.042969 z m -0.01953,1.3515625 -0.07227,0.052734 c -2.053119,1.4973165 -3.409812,3.8009245 -3.207031,6.4335945 0.185776,2.411761 1.425933,4.568685 3.201171,6.101562 l 0.06836,0.05859 0.11914,-0.136719 -0.06836,-0.06055 c -1.743027,-1.505063 -2.957024,-3.618403 -3.138672,-5.976562 -0.197385,-2.562618 1.120571,-4.80398 3.132813,-6.271485 L 16.13086,9.37304 Z m -0.02734,1.6953125 -0.06055,0.06641 c -1.143012,1.28025 -1.813368,2.922699 -1.673828,4.734375 0.121326,1.575001 0.735445,3.03067 1.669922,4.242188 l 0.05664,0.07227 0.144531,-0.111328 -0.05664,-0.07227 c -0.91501,-1.18628 -1.514449,-2.607992 -1.632813,-4.144532 -0.13546,-1.758719 0.51372,-3.348572 1.628907,-4.597656 l 0.06055,-0.06836 z m -0.05859,3.009766 -0.02148,0.08789 c -0.132906,0.545109 -0.184404,1.119146 -0.138672,1.712891 0.02435,0.316053 0.07191,0.62746 0.138672,0.93164 l 0.01953,0.08789 0.177734,-0.03906 -0.01953,-0.08789 c -0.06498,-0.29608 -0.111073,-0.598759 -0.134766,-0.90625 -0.04425,-0.574493 0.0043,-1.129325 0.132813,-1.65625 l 0.02148,-0.08789 z" />
</svg>
blocks/_setup.php
New file
@@ -0,0 +1,122 @@
<?php
use JVBase\utility\Image;
function ajv_render_core_site_logo(array $block, string $content):string
{
    $open = $close = '';
    if (!is_home() && !is_front_page()) {
        $open = '<a href="'.get_home_url().'" rel="home">';
        $close = '</a>';
    }
    $icons = (array_key_exists('className', $block['attrs']) && str_contains($block['attrs']['className'], 'is-text')) ? jvbIcon('logo-jakevan') : jvbIcon('logo').jvbIcon('jakevan');
    return $open.$icons.$close;
}
function ajv_render_core_cover(array $block, string $content):string
{
    $types = array_map(function($type) {
        return BASE.$type;
    }, array_keys(JVB_CONTENT));
    if (!is_post_type_archive($types)) {
        return JVB()->blocks()->render_core_cover($block);
    }
    $obj = get_queried_object();
    foreach ($types as $type) {
        if ($type === $obj->name) {
            $type = jvbNoBase($type);
            $function = 'ajv_render_'.$type.'_cover';
            return '<section class="align-full cover alt '.$type.'">'.call_user_func($function).'</section>';
        }
    }
    return JVB()->blocks()->render_core_cover($block);
}
function ajv_get_limited_posts(string $type, int $limit):array {
    $posts = new WP_Query([
        'post_type'         => jvbCheckBase($type),
        'posts_per_page'    => $limit,
        'post_status'       => 'publish',
        'fields'            => 'ids',
    ]);
    return array_map(function($item) {
        return jvbFormatImage(get_post_thumbnail_id($item), 'tiny', 'large', false);
    },$posts->posts);
}
function ajv_render_art_cover():string
{
    $get = 4;
    $images = ajv_get_limited_posts('art', $get);
    $out = '';
    $halftone = '<div class="halftone"></div>';
    for ($i=0; $i<$get; $i++) {
        $img = (array_key_exists($i, $images)) ? $images[$i] : '';
//        if ($i%4===2) {
//            $before = $halftone;
//            $after = '';
//        } elseif($i%4 === 0) {
//            $before = '';
//            $after = $halftone;
//        }
        $img = ($i%2===0) ? '<div class="img halftone">'.$img.'</div>' : $img;
        $class = ($i%2===0) ? ' class="has-img"' :'';
        $out .= '<div'.$class.'>'.$img. '</div>';
    }
    return $out;
}
function ajv_render_strategy_cover():string
{
    $get = 7;
    $images = ajv_get_limited_posts('strategy', $get);
    $out = '';
    for ($i=0; $i<$get; $i++) {
        $img = (array_key_exists($i, $images)) ? $images[$i] : '';
        $out .= '<div>'.$img. '</div>';
    }
    return $out;
}
function ajv_render_development_cover():string
{
    $get = 2;
    $images = ajv_get_limited_posts('development', $get);
    $out = '';
    for ($i=0; $i<$get; $i++) {
        $img = (array_key_exists($i, $images)) ? $images[$i] : '';
        $out .= '<div><div>'.$img. '</div></div>';
    }
    $get = 3;
    for ($i=0; $i<$get; $i++) {
        $out .= '<div class="radial"></div>';
    }
    return $out;
}
function ajv_render_design_cover():string
{
    $get = 4;
    $images = ajv_get_limited_posts('design', $get);
    $out = '';
    for ($i=0; $i<$get; $i++) {
       $out.= '<div><div>';
        $out .= (array_key_exists($i, $images)) ? $images[$i] : '';
        $out .= '</div></div>';
    }
    return $out;
}
function ajv_render_support_cover():string
{
    return '';
}
function ajv_render_writing_cover():string
{
    $get = 7;
    $images = ajv_get_limited_posts('writing', $get);
    $out = '';
    for ($i=0; $i<$get; $i++) {
        $img = (array_key_exists($i, $images)) ? $images[$i] : '';
        $out .= '<div>'.$img. '</div>';
    }
    return $out;
}
content/_setup.php
File was renamed from content/setup.php
@@ -46,4 +46,12 @@
        'writing'       => ajv_writing(),
        'support'       => ajv_support(),
    ];
}
add_filter('wp_footer', 'ajv_gallery_output');
function ajv_gallery_output():void
{
    if (is_singular(array_map(function($item) { return BASE.$item; }, array_keys(JVB_CONTENT)))) {
        jvbRenderGallery();
    }
}
content/art.php
@@ -1,5 +1,7 @@
<?php
// /content/art.php
use JVBase\meta\Meta;
function ajv_art():array
{
    return [
@@ -7,40 +9,208 @@
        'plural'       => 'Art',
        'dash_title'    => 'Art',
        'dash_description' => 'Manage your art posts',
        'directory' => 'Art',
        'breadcrumb'    => 'Art',
        'addCrumb'  => 'form',
        'hide_single'  => false,
        'show_feed'    => true,
        'show_directory'=> true,
        'favouritable' => true,
        'karma'        => false,
        'icon'         => 'palette',
        'seo' => [
            'schema' => [
                'type' => 'VisualArtwork',
                'name' => '{{post_title}}',
                'description' => '{{post_excerpt}}',
                'about' => ['@id' => '{{site_url}}/#art'],
                'associatedMedia' => '{{post_thumbnail}}',
                'dateCreated' => '{{post_date}}',
                // artform, artMedium, creator, keywords auto-enriched by VisualArtworkResolver
            ],
            'meta' => [
                'title' => '{{post_title}} — {{form.name}} Art | Handmade. Human.',
                'description' => '{{post_excerpt}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => 'Canadian Art. Made in Edmonton, Alberta.',
                'description' => 'Handmade sculpture, jewelry, and more from Edmonton, Alberta.',
            ],
        ],
        'feed'      => [
            'single'    => [
                'pre_title' => 'Canadian Art. Made in Edmonton, Alberta.',
            ],
            'archive'   => [
            ],
            'config'    => [
                'is_gallery'    => false,
                'content'       => 'art',
                'context'       => 'art',
                'id'            => [],
                'class'         => [],
            ]
        ],
        'rewrite'      => [
            'slug'       => 'art',
            'with_front' => false,
        ],
        'fields'       => [
            'post_status'         => [
                'type'      => 'radio',
                'label'     => 'Status',
                'options'   => [
                    'publish'   => 'Show',
                    'draft'     => 'Hide',
                    'trash'     => 'Scrap',
                    'delete'    => 'Permanently Delete'
                ],
                'hidden'    => true,
            ],
            'post_title'     => [
                'type'  => 'text',
                'label' => 'Title',
            ],
            'featured_image' => [
                'type'  => 'image',
            'post_date' => [
                'type'  => 'date',
                'label' => 'Date',
            ],
            'city'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'city',
                'autocomplete'  => true,
                'label' => 'City',
            ],
            'form'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'form',
                'autocomplete'  => true,
                'label' => 'Art Form',
            ],
            'media'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'media',
                'autocomplete'  => true,
                'label' => 'Media',
            ],
            'style'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'style',
                'autocomplete'  => true,
                'label' => 'Style',
            ],
            'theme'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'theme',
                'autocomplete'  => true,
                'label' => 'Theme',
            ],
            'project'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'project',
                'autocomplete'  => true,
                'label' => 'Project',
            ],
            'post_thumbnail' => [
                'type'  => 'upload',
                'label' => 'Image',
            ],
            'gallery'        => [
                'type'  => 'gallery',
                'type'  => 'upload',
                'multiple'=> 'true',
                'label' => 'Gallery',
            ],
            'price'          => [
                'type'  => 'number',
                'label' => 'Price',
            ],
            'post_excerpt'  => [
                'type'  => 'textarea',
                'label' => 'Short Blurb',
            ],
            'post_content'   => [
                'type'  => 'textarea',
                'quill' => true,
                'label' => 'Notes'
            ]
            ],
            'needs' => [
                'type'  => 'repeater',
                'label' => 'Needs',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Need',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'wants' => [
                'type'  => 'repeater',
                'label' => 'Wants',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Want',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
        ],
        'single_image' => false,
        'upload_title' => 'Upload Artwork',
    ];
}
function ajv_render_art_content(array $block, string $content):string
{
    $ID = get_the_ID();
    $meta = Meta::forPost($ID);
    $fields = $meta->getAll();
    $city = (empty($fields['city'])) ? 'Edmonton' : jvbGetTermLink((int)$fields['city']);
    $form = (empty($fields['form'])) ? 'art' : jvbGetTermLink((int)$fields['form']);
    $style = (empty($fields['style'])) ? '' : jvbGetTermLink(explode(',',$fields['style'])[0]).' ';
    $subtitle = '<h2 class="subtitle">'.$city.' handmade '.$style.'<b>'.$form.'</b>.</h2>';
    /** INTRO **/
    $intro = '<section id="intro" class="row"><div class="text">'.apply_filters('wpautop', $fields['post_excerpt']).'</div><div class="images">';
    $intro .= (!empty($fields['post_thumbnail'])) ? jvbImageCaption($fields['post_thumbnail']) : '';
    if (!empty($fields['gallery'])) {
        $images = explode(',',$fields['gallery']);
        foreach ($images as $image) {
            $intro .= jvbImageCaption($image, 'tiny', 'medium');
        }
    }
    $intro .= '</section>';
    /** META **/
    $taxonomies = ['city', 'project','form', 'media','style','theme'];
    $meta = '';
    foreach ($taxonomies as $taxonomy) {
        if (!empty($fields[$taxonomy])) {
            $icon = jvbIcon(JVB_TAXONOMY[$taxonomy]['icon'])??'';
            $meta .= jvbRenderTermList($fields[$taxonomy], $icon.JVB_TAXONOMY[$taxonomy]['singular']);
        }
    }
    if ($meta !== '') {
        $meta = '<section class="meta">'.$meta.'</section>';
    }
    return $subtitle.$meta.$intro.$meta;
}
content/design.php
@@ -3,30 +3,105 @@
function ajv_design():array
{
    return [
        'singular'       => 'Graphic Design',
        'singular'       => 'Design',
        'plural'       => 'Designs',
        'hide_single'  => false,
        'redirectToAuthor'=> false,
        'directory' => 'Design',
        'show_feed'    => true,
        'show_directory'=> true,
        'favouritable' => true,
        'karma'        => false,
        'icon'         => 'artwork',
        'icon'         => 'scribble',
        'rewrite'      => [
            'slug'       => 'design',
            'with_front' => false,
        ],
        // design.php
        'seo' => [
            'schema' => [
                'type' => 'CreativeWork',
                'name' => '{{post_title}}',
                'description' => '{{post_excerpt}}',
                'about' => ['@id' => '{{site_url}}/#design'],
                'associatedMedia' => '{{post_thumbnail}}',
                'dateCreated' => '{{post_date}}',
                'keywords' => '{{style.name}}',
            ],
            'meta' => [
                'title' => '{{post_title}} | Human-made Design',
                'description' => '{{post_excerpt}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => 'Canadian Design. Made in Edmonton, Alberta.',
            ],
        ],
        'feed'      => [
            'single'    => [
                'pre_title' => 'Canadian Design. Made in Edmonton, Alberta.',
            ],
            'archive'   => [
            ],
            'config'    => [
                'is_gallery'    => false,
                'content'       => 'design',
                'context'       => 'design',
                'id'            => [],
                'class'         => [],
            ]
        ],
        'fields'       => [
            'post_status'         => [
                'type'      => 'radio',
                'label'     => 'Status',
                'options'   => [
                    'publish'   => 'Show',
                    'draft'     => 'Hide',
                    'trash'     => 'Scrap',
                    'delete'    => 'Permanently Delete'
                ],
                'hidden'    => true,
            ],
            'post_date'  => [
                'type'      => 'date',
                'label'     => 'Date',
            ],
            'post_title'     => [
                'type'  => 'text',
                'label' => 'Title',
            ],
            'featured_image' => [
                'type'  => 'image',
            'post_thumbnail' => [
                'type'  => 'upload',
                'label' => 'Image',
            ],
            'project'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'project',
                'autocomplete'  => true,
                'label' => 'Project',
            ],
            'city'  => [
                'type'  => 'taxonomy',
                'autocomplete'  => true,
                'taxonomy'  => 'city',
                'label' => 'City',
            ],
            'style'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'style',
                'autocomplete'  => true,
                'label' => 'Styles',
            ],
            'theme'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'theme',
                'autocomplete'  => true,
                'label' => 'Theme',
            ],
            'gallery'        => [
                'type'  => 'gallery',
                'label' => 'Gallery',
                'type'      => 'upload',
                'multiple'  => true,
                'label'     => 'Gallery',
            ],
            'price'          => [
                'type'  => 'number',
@@ -36,7 +111,40 @@
                'type'  => 'textarea',
                'quill' => true,
                'label' => 'Notes'
            ]
            ],
            'needs' => [
                'type'  => 'repeater',
                'label' => 'Needs',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Need',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'wants' => [
                'type'  => 'repeater',
                'label' => 'Wants',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Want',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
        ],
        'single_image' => false,
        'upload_title' => 'Upload Artwork',
content/development.php
@@ -6,8 +6,10 @@
    return [
        'singular'       => 'Development',
        'plural'       => 'Developments',
        'directory' => 'Development',
        'hide_single'  => false,
        'redirectToAuthor'=> false,
        'show_directory'=> true,
        'show_feed'    => true,
        'favouritable' => true,
        'karma'        => false,
@@ -16,18 +18,86 @@
            'slug'       => 'development',
            'with_front' => false,
        ],
        'seo' => [
            'schema' => [
                'type' => 'CreativeWork',
                'name' => '{{post_title}}',
                'description' => '{{post_excerpt}}',
                'about' => ['@id' => '{{site_url}}/#development'],
                'associatedMedia' => '{{post_thumbnail}}',
                'dateCreated' => '{{post_date}}',
            ],
            'meta' => [
                'title' => '{{post_title}} | Custom Website Development',
                'description' => '{{post_excerpt}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => 'Custom Canadian Website Development. Made in Edmonton, Alberta.',
            ],
        ],
        'feed'      => [
            'single'    => [
                'pre_title' => 'Custom Canadian Website Development. Made in Edmonton, Alberta.',
            ],
            'archive'   => [
            ],
            'config'    => [
                'is_gallery'    => false,
                'content'       => 'development',
                'context'       => 'development',
                'id'            => [],
                'class'         => [],
            ]
        ],
        'fields'       => [
            'post_status'         => [
                'type'      => 'radio',
                'label'     => 'Status',
                'options'   => [
                    'publish'   => 'Show',
                    'draft'     => 'Hide',
                    'trash'     => 'Scrap',
                    'delete'    => 'Permanently Delete'
                ],
                'hidden'    => true,
            ],
            'post_title'     => [
                'type'  => 'text',
                'label' => 'Title',
            ],
            'featured_image' => [
                'type'  => 'image',
            'post_date'  => [
                'type'      => 'date',
                'label'     => 'Date',
            ],
            'post_thumbnail' => [
                'type'  => 'upload',
                'label' => 'Image',
            ],
            'project'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'project',
                'autocomplete'  => true,
                'label' => 'Project',
            ],
            'target'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'target',
                'autocomplete'  => true,
                'label' => 'Target Audience',
            ],
            'city'  => [
                'type'  => 'taxonomy',
                'autocomplete'  => true,
                'taxonomy'  => 'city',
                'label' => 'City',
            ],
            'gallery'        => [
                'type'  => 'gallery',
                'label' => 'Gallery',
                'type'      => 'upload',
                'multiple'  => true,
                'label'     => 'Gallery',
            ],
            'price'          => [
                'type'  => 'number',
@@ -37,7 +107,40 @@
                'type'  => 'textarea',
                'quill' => true,
                'label' => 'Notes'
            ]
            ],
            'needs' => [
                'type'  => 'repeater',
                'label' => 'Needs',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Need',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'wants' => [
                'type'  => 'repeater',
                'label' => 'Wants',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Want',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
        ],
        'single_image' => false,
        'upload_title' => 'Upload Artwork',
content/strategy.php
@@ -7,6 +7,8 @@
        'plural'       => 'Strategies',
        'hide_single'  => false,
        'redirectToAuthor'=> false,
        'show_directory'=> true,
        'directory' => 'Strategy',
        'show_feed'    => true,
        'favouritable' => true,
        'karma'        => false,
@@ -15,18 +17,85 @@
            'slug'       => 'strategy',
            'with_front' => false,
        ],
        'seo' => [
            'schema' => [
                'type' => 'CreativeWork',
                'name' => '{{post_title}}',
                'description' => '{{post_excerpt}}',
                'about' => ['@id' => '{{site_url}}/#strategy'],
                'associatedMedia' => '{{post_thumbnail}}',
                'dateCreated' => '{{post_date}}',
            ],
            'meta' => [
                'title' => '{{post_title}} | Brand Strategy in Canada',
                'description' => '{{post_excerpt}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => 'Brand Strategy in Canada. Made in Edmonton, Alberta.',
            ],
        ],
        'feed'      => [
            'single'    => [
                'pre_title' => 'Brand Strategy in Canada. Made in Edmonton, Alberta.',
            ],
            'archive'   => [
            ],
            'config'    => [
                'is_gallery'    => false,
                'content'       => 'strategy',
                'context'       => 'strategy',
                'id'            => [],
                'class'         => [],
            ]
        ],
        'fields'       => [
            'post_status'         => [
                'type'      => 'radio',
                'label'     => 'Status',
                'options'   => [
                    'publish'   => 'Show',
                    'draft'     => 'Hide',
                    'trash'     => 'Scrap',
                    'delete'    => 'Permanently Delete'
                ],
                'hidden'    => true,
            ],
            'post_date'  => [
                'type'      => 'date',
                'label'     => 'Date',
            ],
            'post_title'     => [
                'type'  => 'text',
                'label' => 'Title',
            ],
            'featured_image' => [
                'type'  => 'image',
            'post_thumbnail' => [
                'type'  => 'upload',
                'label' => 'Image',
            ],
            'project'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'project',
                'autocomplete'  => true,
                'label' => 'Project',
            ],
            'target'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'target',
                'autocomplete'  => true,
                'label' => 'Target Audience',
            ],
            'city'  => [
                'type'  => 'taxonomy',
                'autocomplete'  => true,
                'taxonomy'  => 'city',
                'label' => 'City',
            ],
            'gallery'        => [
                'type'  => 'gallery',
                'label' => 'Gallery',
                'type'      => 'upload',
                'multiple'  => true,
                'label'     => 'Gallery',
            ],
            'price'          => [
                'type'  => 'number',
@@ -36,7 +105,40 @@
                'type'  => 'textarea',
                'quill' => true,
                'label' => 'Notes'
            ]
            ],
            'needs' => [
                'type'  => 'repeater',
                'label' => 'Needs',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Need',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'wants' => [
                'type'  => 'repeater',
                'label' => 'Wants',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Want',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
        ],
        'single_image' => false,
        'upload_title' => 'Upload Artwork',
content/support.php
@@ -8,6 +8,7 @@
        'hide_single' => false,
        'show_feed' => false,
        'icon' => 'question',
        'public'    => false,
        'rewrite' => [
            'slug' => 'support',
            'with_front' => false,
content/writing.php
@@ -8,6 +8,8 @@
        'hide_single'  => false,
        'redirectToAuthor'=> false,
        'show_feed'    => true,
        'show_directory'=> true,
        'directory' => 'Writing',
        'favouritable' => true,
        'karma'        => false,
        'icon'         => 'pen-nib',
@@ -15,18 +17,86 @@
            'slug'       => 'writing',
            'with_front' => false,
        ],
        'seo' => [
            'schema' => [
                'type' => 'CreativeWork',
                'name' => '{{post_title}}',
                'description' => '{{post_excerpt}}',
                'about' => ['@id' => '{{site_url}}/#writing'],
                'associatedMedia' => '{{post_thumbnail}}',
                'dateCreated' => '{{post_date}}',
            ],
            'meta' => [
                'title' => '{{post_title}} | Human-made Writing',
                'description' => '{{post_excerpt}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => 'Canadian Content Writing. From Edmonton, Alberta.',
            ],
        ],
        'feed'      => [
            'single'    => [
                'pre_title' => 'Canadian Content Writing. From Edmonton, Alberta.',
            ],
            'archive'   => [
            ],
            'config'    => [
                'is_gallery'    => false,
                'content'       => 'writing',
                'context'       => 'writing',
                'id'            => [],
                'class'         => [],
            ]
        ],
        'fields'       => [
            'post_status'         => [
                'type'      => 'radio',
                'label'     => 'Status',
                'options'   => [
                    'publish'   => 'Show',
                    'draft'     => 'Hide',
                    'trash'     => 'Scrap',
                    'delete'    => 'Permanently Delete'
                ],
                'hidden'    => true,
            ],
            'post_title'     => [
                'type'  => 'text',
                'label' => 'Title',
            ],
            'featured_image' => [
                'type'  => 'image',
            'post_date'  => [
                'type'      => 'date',
                'label'     => 'Date',
            ],
            'post_thumbnail' => [
                'type'  => 'upload',
                'label' => 'Image',
            ],
            'project'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'project',
                'autocomplete'  => true,
                'label' => 'Project',
            ],
            'target'  => [
                'type'  => 'taxonomy',
                'taxonomy'  => 'target',
                'autocomplete'  => true,
                'label' => 'Target Audience',
            ],
            'city'  => [
                'type'  => 'taxonomy',
                'autocomplete'  => true,
                'taxonomy'  => 'city',
                'label' => 'City',
            ],
            'gallery'        => [
                'type'  => 'gallery',
                'label' => 'Gallery',
                'type'      => 'upload',
                'multiple'  => true,
                'label'     => 'Gallery',
            ],
            'price'          => [
                'type'  => 'number',
@@ -36,7 +106,39 @@
                'type'  => 'textarea',
                'quill' => true,
                'label' => 'Notes'
            ]
            ],
            'needs' => [
                'type'  => 'repeater',
                'label' => 'Needs',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Need',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'wants' => [
                'type'  => 'repeater',
                'label' => 'Wants',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Want',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
        ],
        'single_image' => false,
        'upload_title' => 'Upload Artwork',
email/_setup.php
New file
@@ -0,0 +1,311 @@
<?php
$jvbEmail = add_filter('jvb_email', 'ajv_email');
function ajv_email(array $defaults):array
{
    return [
        'colours'       => [
            'action-0'      => '#ef767a',
            'action-50'     => '#f28d90',
            'action-100'    => '#f4a4a6',
            'action-200'    => '#f7bbbd',
            'secondary-0'   => '#329dcb',
            'secondary-50'  => '#5ab1d6',
            'secondary-100' => '#83c4e0',
            'secondary-200' => '#acd8ea',
            'light'         => '#ededf4',
            'light-50'      => '#e3e3ee',
            'light-100'     => '#dadae8',
            'light-200'     => '#d1d1e3',
            'dark'          => '#2a2b2a',
            'dark-50'       => '#2f302f',
            'dark-100'      => '#393a39',
            'dark-200'      => '#3e403e',
            'action-contrast'=> '#ededf4',
            'secondary-contrast'=> '#ededf4',
        ],
        'content'       => [
            'title'             => get_bloginfo('name'),
            'subjectPrefix'     => '['.get_bloginfo('name').']',
            'signature'         => '<p>&emsp; —  ♡ Jake</p>',
            'footer'    => [
                '<p>&copy; ' . date('Y') . ' JakeVan — Bringing ideas to life.</p>',
                '<p><a href="' . get_home_url() . '">JakeVan</a></p>'
            ]
        ],
        'types' => [
            'newUser' => [
                'subject'       => 'Welcome to JakeVan! Finish creating your account.',
                'showPrefix'    => true,
            ],
            'resetPass' => [
                'subject'   => 'Reset your Password'
            ],
            'emailChange'   => [
                'subject'   => 'Successfully Changed Email'
            ],
            'passwordChange'    => [
                'subject'   => 'Successfully Changed Password',
            ]
        ]
    ];
}
add_filter('jvb_form_email_to', function() {
    return 'get@jakevan.ca';
});
add_filter('jvb_form_email_subject', 'ajv_form_email_subject', 10, 3);
function ajv_form_email_subject(string $subject, $formType, $formData):string
{
    $base = '[JakeVan]';
    switch ($formType) {
        case 'contact':
            return $base.' Contact';
        case 'get_an_estimate':
            return $base.' Estimate';
        case 'nlp':
            return $base.' NLP Request';
        case 'partner':
            return $base.' Partner Intro';
    }
    return $subject;
}
/*
 * EXTEND WITH:
 *      {string} $message: email content
*       {WP_User} $user: user
 * apply_filters
 *      jvbNewUserEmail         ->  New user email content
 *          add_filter('jvbNewUserEmail', 'customFunction', 10, 2);
 *      jvbNewUserAdminEmail    ->  New User notification for admin
 *          add_filter('jvbNewUserAdminEmail', 'customFunction', 10, 2);
 *      jvbPasswordResetEmail   ->  Password Reset Email
 *          {string} $message: email content
 *          {string} $key
 *          {string} $user_login,
 *          {WP_User} $user_data
 *          add_filter('jvbPasswordResetEmail', 'customFunction', 10, 4);
 *      jvbEmailChangeRequestEmail      ->  Request for email change
 *          {string} $message
 *          {array} $oldUser
 *          {array} newUser
 *          add_filter('jvbEmailChangeRequestEmail', 'customFunction', 10, 3);
 *      jvbEmailChangedEmail    ->  Notification that email successfully changed
 *          {string} $message
 *          {string} $confirm_url
            add_filter('jvbEmailChangedEmail', 'customFunction', 10, 2);
 *      jvbPasswordChangeEmail  ->  Request for password change
 *          {string} $message
 *          {array} $oldUser
 *          {array} $newUser
 *          add_filter('jvbPasswordChangeEmail', 'customFunction', 10, 3);
 *      jvbPersonalDataExport   ->  Request for User Data
 *          {string} $message
 *          {string} $request_type
 *          {string} $confirmation_url
 *          {array} $emailData, from the original filter
 *          add_filter('jvbPersonalDataExport', 'customFunction', 10, 4);
 *      jvbPersonalDataExported ->  Notification that data is ready for download
 *          {string} $message
 *          {string} $downloadURL
 *          {string} $expiresAt
 *          {array} $emailData, from the original filter
 *          add_filter('jvbPersonalDataExported', 'customFunction', 10, );
 *
 */
add_filter('jvbNewUserEmail', 'ajv_new_user_email', 10, 2);
function ajv_new_user_email(string $message, WP_User $user):string
{
    $user_login = $user->user_login;
    // Only create the password key if the user can change their password
    $key = get_password_reset_key($user);
    if (!is_wp_error($key)) {
        $reset_url = network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');
        $message = sprintf(
            '<p>Hey %s!</p>
            <p>Thanks for signing up for our referral program at Legacy.</p>
            <p><b>Login with your email: </b> %s</p>
            <p>To set your password and access your account, click the button below:</p>%s
            <p>Or copy and paste this link into your browser: %s</p>
            <p>Or go passwordless, and just sign on with a magic link.</p>
            <div class="divider"></div>
            <p>If you didn\'t create this account, just ignore this email and the link will expire.</p>',
            $user->display_name,
            $user->user_login,
            JVB()->email()->button($reset_url, 'Set Your Password'),
            JVB()->email()->link($reset_url)
        );
    }
    return $message;
}
/*** EDMONTON INK VERSIONS: ***/
function eink_new_user_email(string $message, WP_User $user):string
{
    $user_login = $user->user_login;
    // Only create the password key if the user can change their password
    $key = get_password_reset_key($user);
    if (!is_wp_error($key)) {
        $reset_url = network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');
        $message = sprintf('<p>Hey %s!</p>', $user->first_name);
        $message .= '<p>Thanks for joining Edmonton\'s tattoo scene. Here\'s your login information:</p>';
        $message .= sprintf('<p><strong>Username:</strong> %s</p>', $user_login);
        $message .= '<p>To set your password and access your account, click the button below:</p>';
        $message .= sprintf('<p style="text-align: center;"><a href="%s" class="button">Set Your Password</a></p>', $reset_url);
        $message .= '<p>Or copy and paste this link into your browser:</p>';
        $message .= sprintf('<p style="user-select:all;">%s</p>', $reset_url);
        $message .= '<p>This link will expire in 24 hours, for security reasons.</p>';
        if (in_array('jvb_artist', array_values($user->roles))) {
            $message .= '<div class="divider"></div>';
            $message .= '<h3>NOTE:</h3>
                    <p>Once you set your password, you\'ll have access to your custom dashboard where you can:</p>
                    <ul>
                        <li>Manage your profile information</li>
                        <li>Upload tattoos/piercings, and artwork</li>
                    </ul>
                    <p>Nothing will be published until you\'ve been approved by 3 already approved artists, or the admin.</p>
                    <p>Admins check every day or three, but, if you are in a rush, you can contact us directly by replying to this email, or texting us at 825-925-9916.</p>';
        } elseif (in_array('jvb_partner', array_values($user->roles))) {
            $message .= '<div class="divider"></div>';
            $message .= '<h3>NOTE:</h3>
                    <p>Once you set your password, you\'ll have access to your custom dashboard where you can:</p>
                    <ul>
                        <li>Manage your profile information</li>
                        <li>Create offers for enthusiasts or partners or both</li>
                    </ul>
                    <p>Nothing will be published until you\'ve been approved by the admin.</p>
                    <p>Admins check every day or three, but, if you are in a rush, you can contact us directly by replying to this email, or texting us at 825-925-9916.</p>
                    <p><strong>Note:</strong>Even after approval by admin, your ability to publish depends on your karmic standing by artists. Artists each have a vote they can cast (UP or DOWN) - if your karmic score dips too far in the negative, you account is subject to reconsideration or even a ban.</p>';
        }
        $message .= '<div class="divider"></div>';
        $message .= '<p>If you didn\'t create this account, please ignore this email and the link will expire.</p>';
        $message .= sprintf('<p>Ink on, %s</p>', $user->first_name);
    }
    return $message;
}
function eink_new_user_admin_email(string $message, WP_User $user):string
{
    $message .= sprintf(
        '<p><strong>Role:</strong> %s</p>',
        str_replace(BASE, '', array_values($user->roles)[0])
    );
    return $message;
}
function eink_password_reset_email(string $message, string $user_login, WP_User $user, string $resetUrl):string
{
    return sprintf(
        '<p>Hi bud,</p>
            <p>We received a request to reset the password for an account associated with this email:</p>
            <p><strong>Username:</strong> %s</p>
            <p>If you didn\'t make this request, you can safely ignore this email and nothing will happen to your account.</p>
            <p>To reset your password, click the button below:</p>
            %s
            <p>Or copy and paste this link into your browser:</p>
            %s
            <div class="divider"></div>
            <p>This password reset link is only valid for 24 hours.</p>',
        $user_login,
        JVB()->email()->button($resetUrl,'Reset Password'),
        JVB()->email()->link($resetUrl)
    );
}
function eink_email_change_request_email(string $message, array $oldUser, array $newUser)
{
    return sprintf(
        '<p>Hi %s,</p>
        <p>Ideally you already know this: someone asked to change your email, and here we are.</p>
        <p><strong>Old Email:</strong> %s</p>
        <p><strong>New Email:</strong> %s</p>
        <div class="divider"></div>
        <p>If this is news to you, or you did not request this - please contact us immediately. You can <a href="sms:+18258239916">text us</a> or reply to this email."></a></p>
        %s',
        $newUser['first_name'],
        $oldUser['user_email'],
        $newUser['user_email'],
        JVB()->email()->button(wp_login_url(), 'Log In To Your Account')
    );
}
function eink_email_changed_email(string $message, string $confirmURL):string
{
    return sprintf(
        '<p>Hey human,</p>
            <p>Seems you want to change the email associated with your account.</p>
            <p>If you really want this, please confirm this change by clicking the button below:</p>
            %s
            <p>Or copy and paste this link into your browser:</p>
            %s',
        JVB()->email()->button($confirmURL, 'Confirm this Email'),
        JVB()->email()->link($confirmURL)
    );
}
function eink_password_changed_email(string $message, array $oldUser, array $newUser):string
{
    return sprintf(
        '<p>Hey bud,</p>
            <p>This is a confirmation email to let you know your password has successfully been changed.</p>
            <p>Ideally, you\'re expecting this email. You wanted to change your password, and this is to let you know that it\'s definitely updated.</p>
            <p>If you\'re not expecting this email, and did not change your password - please <strong>contact us immediately</strong></p>
            <p>You can <a href="sms:+18259257398">text us</a>, or reply to this email.</p>
            %s',
        JVB()->email()->button(wp_login_url(), 'Log In to Your Account')
    );
}
function eink_personal_data_export(string $message, string $requestType, string $confirmURL, array $emailData):string
{
    switch ($requestType) {
        case 'export_personal_data':
            $request_name = 'Export Personal Data';
            break;
        case 'remove_personal_data':
            $request_name = 'Erase Personal Data';
            break;
        default:
            $request_name = 'Data Request';
    }
    return sprintf(
        '<p>Hi privacy enthusiast,</p>
            <p>You\'re receiving this email because a request has been made to <strong>%s</strong></p>
            <p>If you\'re the one who made this request, you can confirm it by clicking the button below:</p>
            %s
            <p>Or copy and paste this link into your browser:</p>
            %s',
        $request_name,
        JVB()->email()->button($confirmURL, 'Confirm'),
        JVB()->email()->link($confirmURL)
    );
}
function eink_personal_data_exported_email(string $message, string $downloadURL, string $expiresAt, array $emailData):string
{
    return sprintf(
        '<p>Hi again,</p>
            <p>You\'re receiving this email because you requested an export of your personal data.</p>
            <p>You can download your personal data by clicking the button below:</p>
            %s
            <p>Or you can copy and paste this link into your browser:</p>
            %s
            <div class="divider"></div>
            <p><strong>Important:</strong> For privacy and security, this link will expire at %s.</p>',
        JVB()->email()->button($downloadURL, 'Download Your Data'),
        JVB()->email()->link($downloadURL),
        $expiresAt
    );
}
forms/_setup.php
New file
@@ -0,0 +1,25 @@
<?php
/*************************************************************
 *
 *  Filters the forms for the form block
 *      Must contain an array with:
 *          'title'         => {string} optional
 *          'description    => {array} of strings, each entry becoming its own <p></p>
 *          'submit'        => {string} submit button text
 *          'success_title' => {string} a custom heading for the success message
 *          'success_message'=> {array} of strings, each entry becoming its own <p></p>
 *          'email_subject' => {string} subject for admin's email
 *          'fields'        => {array} as per MetaManager.php
 *          'sections'      => {array} optional array of sections, as per MetaManager.php, for a tabbed form
 *
 ************************************************************/
require(AJV_DIR . '/forms/contact.php');
add_filter('jvb_register_forms', 'ajv_register_forms');
function ajv_register_forms($forms) {
    $forms['contact']           = ajv_contact();
    return $forms;
}
forms/contact.php
New file
@@ -0,0 +1,64 @@
<?php
function ajv_contact():array
{
    return [
        'title'         => 'Contact',
        'description'   => [
            'You can always text, call, or email.',
            'Or you can fill out this form and we\'ll get back to you as soon as we can.',
        ],
        'submit'        => 'Contact',
        'success_title' => 'Success!',
        'success_description'   => [
            'We got it.',
            'We\'ll get back to you as soon as we can - usually pretty quick (unless it\'s a Monday or a Tuesday)'
        ],
        'email_subject' => '[CONTACT]',
        'fields'        => [
            'first_name'    => [
                'type'  => 'text',
                'label' => 'First Name',
                'autocomplete' => 'given-name',
                'required' => true,
                'section'   => 'about_you',
            ],
            'last_name'     => [
                'type'  => 'text',
                'label' => 'Last Name',
                'required' => true,
                'autocomplete'=> 'family-name',
                'section'   => 'about_you',
            ],
            'email'         => [
                'type'  => 'email',
                'label' => 'Email',
                'autocomplete'  => 'email',
                'required' => true,
                'section'   => 'about_you',
            ],
            'phone'         => [
                'type'  => 'tel',
                'label' => 'Phone',
                'required' => true,
                'autocomplete'  => 'tel',
                'section'   => 'about_you',
            ],
            'contact'       => [
                'type'  => 'checkbox',
                'label' => 'Preferred Contact',
                'options'   => [
                    'text'      => 'Text',
                    'email'     => 'Email',
                    'call'      => 'Call',
                ],
                'section'   => 'about_you',
            ],
            'message'   => [
                'type'  => 'textarea',
                'label' => 'What\'s your idea?',
                'hint'  => 'Include general information about your idea, as well as details such as timeline, budget, location - the more the better!'
            ]
        ]
    ];
}
forms/setup.php
File was deleted
login/_setup.php
New file
@@ -0,0 +1,40 @@
<?php
// /login/setup.php
add_filter('jvb_login', 'ajv_setup_login');
function ajv_setup_login():array
{
    return [
        'login' => [
            'title'        => 'Log in',
            'description'   => ['Log in to your account to see your referral balance and get your unique code!'],
            'submit'        => 'Log in',
        ],
        'favourites'    => [
            'title'         => 'Save your favourites'
        ],
        'lostpassword' => [
            'title'    => 'Forgot Your Password?',
            'description'   => 'No worries, we\'ll send you a reset link to your email.'
        ],
        'register'  => [
            'title'        => 'Create your Account',
            'submit'        => 'Create Account',
            'email'     => [
                'subject'   => '[JakeVan] Finish Creating Your Account'
            ],
            'success'       => [
                'title' => 'Success!',
                'description' => [
                    'See your email for next steps.',
                    '(If you can\'t find it, check your junk!)',
                ],
            ]
        ],
        'magic' => [
            'title' => 'Log in, auto-magically!',
            'description' => [
                'Enter your email, click the link in your email, and bibbity bobbity boo - you\'re logged in!'
            ],
        ]
    ];
}
login/setup.php
File was deleted
seo.php
New file
@@ -0,0 +1,134 @@
<?php
add_filter('jvb_schema', function($schema) {
    return array_merge($schema, [
        'organization' => [
            'type' => 'LocalBusiness',
            'name' => 'JakeVan',
            'url' => get_home_url(),
            'description' => 'Artist. Designer. Developer. Brand Strategy. I’m a multidisciplinary Canadian artist and tech wizard in Edmonton, Alberta.',
            'slogan' => 'Let\'s bring your idea to life.',
            'logo' => get_theme_mod('custom_logo'),
            'foundingDate' => '2022-02-15',
            'founders' => [
                ['name' => 'Jake Vanderwerf', 'url' => 'https://jakevan.ca'],
            ],
            'sameAs' => [
                [ 'url' => 'https://bsky.app/profile/jakevan.ca']
            ],
            // Contact
            'telephone' => '+1-825-832-9916',
            'email' => 'get@jakevan.ca',
            // Address - note the key names
            'address' => [
                'street' => '6551 111 St NW',      // was 'street_address'
                'city' => 'Edmonton',                    // was 'locality'
                'province' => 'AB',                      // was 'region'
                'postal_code' => 'T6H 4R5',
                'country' => 'CA',
            ],
            // Geo - note the key names
            'geo' => [
                'lat' => '53.5035125',                      // was 'latitude'
                'lng' => '-113.5188023',                    // was 'longitude'
            ],
            // Business details
            'priceRange' => '$$',
            'paymentAccepted' => ['Cash', 'Credit Card', 'Debit Card', 'E-Transfer'],
            'currenciesAccepted' => ['CAD'],
            'areaServed' => [
                ['name' => 'Edmonton'],
                ['name' => 'St. Albert'],
                ['name' => 'Sherwood Park'],
                ['name' => 'Leduc'],
                ['name' => 'Spruce Grove'],
            ],
            // Hours - note the key names
            'openingHours' => [
                'monday' => ['opens' => '9:00', 'closes' => '17:00'],
                'tuesday' => ['opens' => '9:00', 'closes' => '17:00'],
                'wednesday' => ['opens' => '9:00', 'closes' => '17:00'],
                'thursday' => ['opens' => '9:00', 'closes' => '17:00'],
                'friday' => ['opens' => '9:00', 'closes' => '17:00'],
                'saturday' => ['opens' => '9:00', 'closes' => '17:00'],
                'sunday' => ['opens' => '9:00', 'closes' => '17:00'],
            ],
            // Services as offer catalog
            'hasOfferCatalog' => [
                'source'    => 'manual',
                'manual_items' => [
                    [
                        'type'  => 'Product',
                        'name' => 'Sculpture',
                        'description' => 'Canadian, human made sculpture',
                    ],
                    [
                        'type'  => 'Product',
                        'name' => 'Kinetic Sculpture',
                        'description' => 'Canadian, human made sculpture that moves!',
                    ],
                    [
                        'type'  => 'Product',
                        'name' => 'Copper Jewellery',
                        'description' => 'Canadian, human made copper jewellery, inspired by nature.',
                    ],
                    [
                        'type' => 'Service',
                        'name' => 'Graphic Design',
                        'description' => 'From logos to book covers and print media',
                    ],
                    [
                        'type' => 'Service',
                        'name' => 'Web Development',
                        'description' => 'From custom website development to basic landing pages - I make a website for you that works while you sleep.',
                    ],
                    [
                        'type' => 'Service',
                        'name' => 'Content Writing',
                        'description' => 'Know what you want to say, but not how to say it? I can help!',
                    ],
                    [
                        'type' => 'Service',
                        'name' => 'Brand Strategy',
                        'description' => 'Whether you\'re getting started with a business plan, or wanting to take a step back to determine your best steps moving forward - I can help.',
                    ],
                ]
            ],
            // Rating - note the structure
//            'aggregateRating' => [
//                'value' => 5,
//                'count' => 103,
//                'best' => 5,
//                'worst' => 1,
//            ],
        ],
        // Website settings (optional overrides)
        'website' => [
            'name' => 'JakeVan',
            'description' => 'Let\'s bring your idea to life.',
            'inLanguage' => 'en-CA',
            'potentialAction' => [
                [
                    'name'  => 'Search',
                    'type' => 'searchAction',
                    'target' => '/?s={query}',
                ],
                [
                    'type' => 'communicateAction',
                    'name' => 'Contact Us',
                    'target' => '/contact/',
                    'description' => 'Get in touch with our team',
                ],
            ],
        ],
    ]);
});
taxonomies/_setup.php
File was renamed from taxonomies/setup.php
@@ -24,11 +24,12 @@
require(AJV_DIR . '/taxonomies/form.php');
require(AJV_DIR . '/taxonomies/media.php');
require(AJV_DIR . '/taxonomies/progress.php');
require(AJV_DIR . '/taxonomies/project.php');
require(AJV_DIR . '/taxonomies/style.php');
require(AJV_DIR . '/taxonomies/target.php');
require(AJV_DIR . '/taxonomies/theme.php');
//add_filter('jvb_taxonomy', 'ajv_taxonomy');
add_filter('jvb_taxonomy', 'ajv_taxonomy');
function ajv_taxonomy():array
{
    return [
@@ -36,8 +37,9 @@
        'style'     => ajv_style(),
        'theme'     => ajv_theme(),
        'form'      => ajv_form(),
        'medium'    => ajv_media(),
        'media'    => ajv_media(),
        'target'    => ajv_target(),
        'progress'  => ajv_progress(),
        'project'  => ajv_project(),
    ];
}
taxonomies/city.php
@@ -25,6 +25,22 @@
            'strategy',
            'writing',
        ],
        'seo' => [
            'schema' => [
                'type' => 'City',
                'name' => '{{term_name}}',
                'description' => '{{term_description}}',
                'containedInPlace' => '{{site_url}}/#organization',
            ],
            'meta' => [
                'title' => 'Projects in {{term_name}} | JakeVan',
                'description' => 'Art, design, development, and strategy projects in {{term_name}}.',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => 'Projects in {{term_name}}',
            ],
        ],
        'fields'         => [
            'term_name' => [
                'label'     => 'Name',
taxonomies/form.php
@@ -20,6 +20,21 @@
            'art',
            'design',
        ],
        'seo' => [
            'schema' => [
                'type' => 'DefinedTerm',
                'name' => '{{term_name}}',
                'description' => '{{term_description}}',
            ],
            'meta' => [
                'title' => '{{term_name}} | Art Forms',
                'description' => '{{term_description}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}} Art',
            ],
        ],
        'fields'         => [
            'term_name' => [
                'label'     => 'Name',
taxonomies/media.php
@@ -9,7 +9,7 @@
            '<b>What it\'s made of.</b>',
            'From clay to oil paints'
        ],
        'icon'           => 'media',
        'icon'           => 'diamonds-four',
        'show_feed'      => true,
        'show_directory' => true,
        'approve_new'    => true,
@@ -22,6 +22,21 @@
        'for_content'    => [
            'art'
        ],
        'seo' => [
            'schema' => [
                'type' => 'DefinedTerm',
                'name' => '{{term_name}}',
                'description' => '{{term_description}}',
            ],
            'meta' => [
                'title' => '{{term_name}} Art | JakeVan',
                'description' => '{{term_description}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}} Artwork',
            ],
        ],
        'fields'         => [
            'term_name' => [
                'label'     => 'Name',
taxonomies/progress.php
@@ -22,6 +22,15 @@
            'strategy',
            'writing',
        ],
        'seo' => [
            'meta' => [
                'title' => '{{term_name}} Projects | JakeVan',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}} Projects',
            ],
        ],
        'fields'         => [
            'term_name' => [
                'label'     => 'Name',
taxonomies/project.php
New file
@@ -0,0 +1,138 @@
<?php
// /taxonomies/progress.php
function ajv_project():array
{
    return [
        'singular'       => 'Project',
        'plural'         => 'Projects',
        'icon'           => 'cards-three',
        'show_feed'      => true,
        'show_directory' => true,
        'approve_new'    => false,
        'rewrite'        => [
            'slug'         => 'projects',
            'with_front'   => false,
            'hierarchical' => true,
        ],
        'hierarchical'   => true,
        'for_content'    => [
            'art',
            'design',
            'development',
            'strategy',
            'writing',
        ],
        'seo' => [
            'schema' => [
                'type' => 'CreativeWork',
                'name' => '{{term_name}}',
                'description' => '{{term_description}}',
                'dateCreated' => '{{started}}',
                'keywords' => '{{target.name}}',
            ],
            'meta' => [
                'title' => '{{term_name}} | Project by JakeVan',
                'description' => '{{term_description}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}}',
                'description' => '{{term_description}}',
            ],
        ],
        'fields'         => [
            'term_name' => [
                'label'     => 'Name',
                'type'      => 'text',
                'quickEdit' => true,
            ],
            'city' => [
                'type'          => 'taxonomy',
                'taxonomy_type' => 'reference',
                'taxonomy'      => 'city',
                'autocomplete'  => true,
                'quickEdit' => true,
                'label'         => 'City',
            ],
            'target' => [
                'type'          => 'taxonomy',
                'taxonomy_type' => 'reference',
                'taxonomy'      => 'target',
                'autocomplete'  => true,
                'quickEdit' => true,
                'label'         => 'Target Audience',
            ],
            'started'   => [
                'type'  => 'date',
                'label' => 'Started',
                'quickEdit' => true,
            ],
            'ended'     => [
                'type'  => 'date',
                'label' => 'Ended',
                'quickEdit' => true,
            ],
            'budget'    => [
                'type'  => 'radio',
                'label' => 'Budget',
                'options'   => [
                    'low'   => '$',
                    'medium-low'=> '$$',
                    'medium'    => '$$$',
                    'medium-high'=> '$$$$',
                    'high'  => '$$$$$',
                ]
            ],
            'timeline'  => [
                'type'  => 'text',
                'label' => 'Timeline',
                'quickEdit' => true,
            ],
            'url'   => [
                'type'  => 'url',
                'label' => 'Project URL',
                'quickEdit' => true,
            ],
            'description'   => [
                'type'  => 'textarea',
                'quill' => true,
                'quickEdit' => true,
                'label' => 'Project Description',
            ],
            'needs' => [
                'type'  => 'repeater',
                'label' => 'Needs',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Need',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'wants' => [
                'type'  => 'repeater',
                'label' => 'Wants',
                'fields'=> [
                    'need' => [
                        'type' => 'text',
                        'label' => 'Want',
                        'required' => true
                    ],
                    'fulfilled' => [
                        'type'  => 'textarea',
                        'quill' => true,
                        'label' => 'How I fulfilled it'
                    ]
                ]
            ],
            'common'    => [ 'wiki' ]
        ]
    ];
}
taxonomies/style.php
@@ -4,9 +4,6 @@
{
    return [
        'directory'    => 'Styles',
        'description'    => [
            'From American Traditional to Japanese.'
        ],
        'singular'     => 'Style',
        'plural'       => 'Styles',
        'show_directory' => true,
@@ -27,6 +24,22 @@
            'strategy',
            'writing',
        ],
        'seo' => [
            'schema' => [
                'type' => 'DefinedTerm',
                'name' => '{{term_name}}',
                'description' => '{{term_description}}',
                'alternateName' => '{{alternate_name}}',
            ],
            'meta' => [
                'title' => '{{term_name}} Style | JakeVan',
                'description' => '{{term_description}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}} Projects',
            ],
        ],
        'fields'       => [
            'term_name'       => [
                'label'     => 'Name',
taxonomies/target.php
@@ -6,7 +6,8 @@
        'singular'     => 'Target Audience',
        'plural'       => 'Target Audiences',
        'icon'         => 'crosshair-simple',
        'show_feed'    => false,
        'show_feed'    => true,
        'show_directory' => true,
        'rewrite'      => [
            'slug'         => 'target',
            'with_front'   => false,
@@ -20,6 +21,15 @@
            'strategy',
            'writing',
        ],
        'seo' => [
            'meta' => [
                'title' => '{{term_name}} Projects | JakeVan',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}} Projects',
            ],
        ],
        'fields'       => [
            'term_name' => [
                'label'     => 'Name',
taxonomies/theme.php
@@ -12,7 +12,7 @@
        ],
        'singular'     => 'Theme',
        'plural'       => 'Themes',
        'icon'         => 'hashtag',
        'icon'         => 'hash',
        'favouritable' => true,
        'show_feed'    => true,
        'approve_new'  => false,
@@ -29,6 +29,22 @@
            'strategy',
            'writing',
        ],
        'seo' => [
            'schema' => [
                'type' => 'DefinedTerm',
                'name' => '{{term_name}}',
                'description' => '{{description}}',
                'alternateName' => '{{alternate_name}}',
            ],
            'meta' => [
                'title' => '{{term_name}} | Themes',
                'description' => '{{description}}',
            ],
            'archive' => [
                'type' => 'CollectionPage',
                'name' => '{{term_name}} Projects',
            ],
        ],
        'fields'       => [
            'term_name'       => [
                'label'     => 'Name',