├── templates ├── .gitkeep ├── pages │ ├── _entry.twig │ ├── _entry-type │ │ ├── home.twig │ │ ├── pages.twig │ │ ├── contactPage.twig │ │ └── newsListing.twig │ └── _news-category.twig ├── search │ ├── index.twig │ ├── _search-item.twig │ └── _components │ │ └── search.twig ├── _includes │ ├── hero.twig │ ├── language-switcher.twig │ ├── notice-bar.twig │ ├── footer.twig │ ├── responsiveImage.twig │ ├── news-listing-article.twig │ ├── contact-form.twig │ └── dark-mode.twig ├── _user-guide │ ├── blocks │ │ ├── image.twig │ │ ├── copy.twig │ │ ├── youtubeVideo.twig │ │ └── video.twig │ ├── _entry.twig │ └── styles.twig ├── _blocks │ ├── fragmentBlock.twig │ ├── codeEmbed.twig │ ├── hero │ │ ├── basicHero.twig │ │ ├── standardHero.twig │ │ └── sliderHero.twig │ ├── copy.twig │ ├── _layout.twig │ ├── callToAction.twig │ ├── video.twig │ └── relatedEntries.twig ├── index.twig ├── _javascript │ └── hero-swiper.js ├── _whitelist.twig ├── 404.twig ├── sitemap.twig ├── _macros.twig ├── _components │ ├── news-listing.twig │ ├── pagination.twig │ └── contact-form.twig ├── _tw-config │ └── tw.json ├── _layout.twig └── criticalCss │ └── index_critical.min.css ├── dbs └── .gitignore ├── public ├── cpresources │ └── .gitignore ├── assets │ ├── images │ │ ├── caffeine-logo.jpg │ │ └── svg │ │ │ ├── hamburger.svg │ │ │ ├── search.svg │ │ │ ├── close.svg │ │ │ ├── chevron-left.svg │ │ │ ├── chevron-double-left.svg │ │ │ ├── chevron-double-right.svg │ │ │ └── chevron-right.svg │ ├── manifest.json │ └── css │ │ └── cp-css.css ├── index.php ├── .htaccess └── web.config ├── storage ├── config-deltas │ └── .gitignore └── .gitignore ├── db.sql.gz ├── config ├── project │ ├── siteGroups │ │ └── 2fcd48d2-b2b1-479f-9015-016904e4eab4.yaml │ ├── graphql │ │ ├── graphql.yaml │ │ └── schemas │ │ │ └── 8084d027-d1a0-424e-930b-a4217b9862f2.yaml │ ├── users │ │ ├── users.yaml │ │ └── groups │ │ │ └── siteAdmin--0878c4de-b946-4c8e-bcce-fe18cd77a73e.yaml │ ├── ckeditor │ │ └── configs │ │ │ ├── b9d8d694-0313-4709-a12e-06b36b2333c7.yaml │ │ │ ├── 170a124d-5ba5-43f5-a663-8f85be97b38b.yaml │ │ │ ├── 3e09420e-30db-49dd-9520-4775f6667303.yaml │ │ │ └── 12f17257-6f1c-4e4c-837e-17ad76241a60.yaml │ ├── sites │ │ ├── default--1a78d395-d81a-4b77-8da7-30a49123bbee.yaml │ │ └── french--b9fdef79-5b63-4932-a9aa-8d18f937e6d9.yaml │ ├── fields │ │ ├── lightSwitch--ce14c790-b25f-464b-8ce8-0e949adc707b.yaml │ │ ├── hideFromNav--56f86cc6-5713-447f-8b10-e53f06ef42eb.yaml │ │ ├── enableNoticeBar--5489ed3b-28c1-4a26-ac7e-97b0182e6652.yaml │ │ ├── embed--3b9496a7-4539-4c28-91bc-3e51c68f4187.yaml │ │ ├── input--c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde.yaml │ │ ├── relatedEntries--5026b221-a48f-4868-9f48-07428068e77e.yaml │ │ ├── fragment--aac80dd6-df34-4cd2-a92f-14debb37b911.yaml │ │ ├── copyBasic--da3d7ec4-1d85-47ba-a517-6c81d94cc9d2.yaml │ │ ├── userGuide--d974bf8d-647d-45f3-98be-0733d5e3e1ba.yaml │ │ ├── copy--f90a85bd-91b2-462b-acb4-8f265ded647e.yaml │ │ ├── slides--8c583e9a-a56d-486d-8550-e7eae61c8088.yaml │ │ ├── newsCategories--fbdde691-0df2-4e8e-b1a8-61a1f555fd0e.yaml │ │ ├── noticeBarLocation--52f12f1b-ba11-48f3-985d-0ee6e2a6dc4e.yaml │ │ ├── seo--149ec41c-d6de-4ae5-84db-08d285801dd1.yaml │ │ ├── hero--ab8abc7e-2a4d-4858-98ea-9a6954a434da.yaml │ │ ├── image2--7bf7da79-8f7d-4a1b-8129-121b24c0d99b.yaml │ │ ├── image--b2f53aa5-81a3-466c-af2d-e30dab4ed3d8.yaml │ │ ├── screenshots--25e2157e-9a82-41cd-970f-4fc58cb3a835.yaml │ │ ├── listingImage--c33fedfd-ec76-45db-93dc-a12697e4a2aa.yaml │ │ ├── videoUpload--6f74be98-1b1b-470e-a96a-727b01e0b225.yaml │ │ ├── backgroundImage--cc618569-5c0e-4ff7-9b4a-2fe9ed27af1f.yaml │ │ ├── padding--127f0d67-cfaf-4e5d-b3f8-111b7fda6f64.yaml │ │ ├── fallbackImage--12c7de12-987a-4aa4-890f-ec5cde880851.yaml │ │ └── contentBuilder--77af5a62-d057-494a-91ac-9edf65b6b266.yaml │ ├── sections │ │ ├── userGuide--0784ad32-f952-40b1-9f6c-d0e67d502551.yaml │ │ ├── error404--29d88d99-dd38-43f6-9ac5-3438833c75ba.yaml │ │ ├── fragments--ce27286a-7635-4494-9c9c-77f2d73352f4.yaml │ │ ├── noticeBar--408314ae-e32d-471b-a729-25f4ce759ac4.yaml │ │ ├── news--9c12e5ad-18e9-498f-bf50-489513409007.yaml │ │ ├── pages--666b31c2-d6d5-4e80-b9aa-f57b66d5b54a.yaml │ │ └── newsCategories--4b342e70-0223-4c29-9237-86a023f74f1b.yaml │ ├── globalSets │ │ └── fallback--415a954c-eb55-4533-9ffd-64b3eade9469.yaml │ ├── entryTypes │ │ ├── basicHero--b4d947dc-370e-4404-807b-b165534a1503.yaml │ │ ├── fragmentBlock--48d0d0b8-2e48-4232-8b09-a401c6493902.yaml │ │ ├── newsCategories--ef488e30-b35e-4bf8-87a3-34f0f76b622f.yaml │ │ ├── image--4427e835-20ed-496b-9469-831bb0882185.yaml │ │ ├── video--2456a57a-605c-4af0-9611-f48ca631ff0a.yaml │ │ ├── codeEmbed--a983660a-2b2e-413f-a79c-498b502b4f85.yaml │ │ ├── youtubeVideo--c4527788-b877-44f3-9a2d-071f696877fa.yaml │ │ ├── fragments--c166cd47-6f64-49e0-b33d-6aceadb3fcc3.yaml │ │ ├── userGuide--475a351b-2442-4767-8ab6-1b39216d0c61.yaml │ │ ├── error404--b312d78c-b490-46da-aeff-70a1be5a5505.yaml │ │ ├── sliderHero--323e9af3-aa75-4f1c-82eb-370e40179f41.yaml │ │ ├── copy2--0187ae10-82fa-43e8-ac5c-e8fa4f2e3b29.yaml │ │ ├── video2--a399fb79-90a6-48a0-be1f-38d2b8a81af5.yaml │ │ ├── copy--70339fac-606b-4827-9a19-c97a3f0bd59c.yaml │ │ ├── standardHero--120a7750-0967-496d-9315-bba6d83eb4b1.yaml │ │ ├── slide--d399ecfb-7ec8-47d8-84ed-b8447e779a67.yaml │ │ ├── relatedEntries--c951c9a0-1cca-4210-bef8-2d3d0446e841.yaml │ │ ├── home--ea7fe716-adee-4200-a8ca-15362418cd97.yaml │ │ ├── callToAction--57a74cde-de83-4b69-88ff-a4472daac7f7.yaml │ │ ├── noticeBar--5bca37e0-a30f-48fd-9fde-3105fb9d9738.yaml │ │ ├── newsListing--e3dea9df-426f-43a5-96fd-927882533aa9.yaml │ │ └── news--51b9c3fc-be2a-4ef3-9f2c-66372327c604.yaml │ └── volumes │ │ ├── userGuide--d19b4314-0267-4e95-9e63-2462a334eea1.yaml │ │ └── uploads--70f5d47b-4830-4d51-95fe-bc0f7ccc0670.yaml ├── htmlpurifier │ └── Default.json ├── environment-label.php ├── knock-knock.php ├── routes.php ├── app.php ├── db.php ├── assetrev.php └── general.php ├── src ├── img │ ├── caffeine-logo.jpg │ └── svg │ │ ├── hamburger.svg │ │ ├── search.svg │ │ ├── chevron-left.svg │ │ ├── chevron-double-right.svg │ │ ├── chevron-double-left.svg │ │ ├── chevron-right.svg │ │ └── close.svg └── js │ ├── app.js │ └── generate-manifest.js ├── postcss.config.js ├── .gitignore ├── craft ├── .vscode └── launch.json ├── bootstrap.php ├── browsersync.config.js ├── .env.example ├── tailwind.config.js ├── composer.json ├── .ddev └── commands │ └── host │ └── launch-site └── package.json /templates/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dbs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /public/cpresources/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/config-deltas/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /db.sql.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CreateSean/craft-starter/HEAD/db.sql.gz -------------------------------------------------------------------------------- /config/project/siteGroups/2fcd48d2-b2b1-479f-9015-016904e4eab4.yaml: -------------------------------------------------------------------------------- 1 | name: 'Craft Starter' 2 | -------------------------------------------------------------------------------- /storage/.gitignore: -------------------------------------------------------------------------------- 1 | backups 2 | composer-backups 3 | config-backups 4 | logs 5 | runtime 6 | -------------------------------------------------------------------------------- /config/project/graphql/graphql.yaml: -------------------------------------------------------------------------------- 1 | publicToken: 2 | enabled: true 3 | expiryDate: null 4 | -------------------------------------------------------------------------------- /src/img/caffeine-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CreateSean/craft-starter/HEAD/src/img/caffeine-logo.jpg -------------------------------------------------------------------------------- /config/project/graphql/schemas/8084d027-d1a0-424e-930b-a4217b9862f2.yaml: -------------------------------------------------------------------------------- 1 | isPublic: true 2 | name: 'Public Schema' 3 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | 'tailwindcss': {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/assets/images/caffeine-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CreateSean/craft-starter/HEAD/public/assets/images/caffeine-logo.jpg -------------------------------------------------------------------------------- /public/assets/images/svg/hamburger.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/project/users/users.yaml: -------------------------------------------------------------------------------- 1 | allowPublicRegistration: false 2 | deactivateByDefault: false 3 | defaultGroup: null 4 | photoSubpath: null 5 | photoVolumeUid: null 6 | requireEmailVerification: true 7 | -------------------------------------------------------------------------------- /templates/pages/_entry.twig: -------------------------------------------------------------------------------- 1 | {# homepage #} 2 | {% extends '_layout' %} 3 | 4 | {% block content %} 5 | {# load the entry type template #} 6 | {% include "pages/_entry-type/" ~ entry.type %} 7 | {% endblock %} -------------------------------------------------------------------------------- /src/img/svg/hamburger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /templates/search/index.twig: -------------------------------------------------------------------------------- 1 | {# Search #} 2 | {% extends '_layout' %} 3 | 4 | {% block content %} 5 | 6 | 7 | {# include reactive search with sprig #} 8 | {{ sprig('search/_components/search', { 'limit':12}) }} 9 | 10 | {% endblock %} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.env 2 | /.env-production 3 | /.idea 4 | /vendor 5 | .DS_Store 6 | /node_modules 7 | /translations/ 8 | /public/uploads/ 9 | /public/guide/ 10 | *.sql 11 | *.bak 12 | /web/assets/cpresources/ 13 | .vscode/tasks.json 14 | .tarbells/ 15 | -------------------------------------------------------------------------------- /templates/_includes/hero.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | {# include hero blocks #} 4 | 5 | {% for block in entry.hero.all() %} 6 | {% include "_blocks/hero/" ~ block.type %} 7 | {% endfor %} -------------------------------------------------------------------------------- /config/project/ckeditor/configs/b9d8d694-0313-4709-a12e-06b36b2333c7.yaml: -------------------------------------------------------------------------------- 1 | headingLevels: 2 | - 1 3 | - 2 4 | - 3 5 | - 4 6 | - 5 7 | - 6 8 | name: Simple 9 | toolbar: 10 | - heading 11 | - '|' 12 | - bold 13 | - italic 14 | - link 15 | -------------------------------------------------------------------------------- /config/project/sites/default--1a78d395-d81a-4b77-8da7-30a49123bbee.yaml: -------------------------------------------------------------------------------- 1 | baseUrl: $SITE_URL_EN 2 | enabled: true 3 | handle: default 4 | hasUrls: true 5 | language: en 6 | name: English 7 | primary: true 8 | siteGroup: 2fcd48d2-b2b1-479f-9015-016904e4eab4 # Craft Starter 9 | sortOrder: 1 10 | -------------------------------------------------------------------------------- /config/project/sites/french--b9fdef79-5b63-4932-a9aa-8d18f937e6d9.yaml: -------------------------------------------------------------------------------- 1 | baseUrl: $SITE_URL_FR 2 | enabled: '1' 3 | handle: french 4 | hasUrls: true 5 | language: fr 6 | name: Français 7 | primary: false 8 | siteGroup: 2fcd48d2-b2b1-479f-9015-016904e4eab4 # Craft Starter 9 | sortOrder: 2 10 | -------------------------------------------------------------------------------- /templates/pages/_entry-type/home.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | {# Hero #} 3 | {% include "_includes/hero" %} 4 | 5 | {% for block in entry.contentBuilder.collect() %} 6 | {% include "_blocks/" ~ block.type %} 7 | {% endfor %} -------------------------------------------------------------------------------- /templates/_user-guide/blocks/image.twig: -------------------------------------------------------------------------------- 1 | {% if block.sectionTitle|length %} 2 |

{{ block.sectionTitle }}

3 | {% endif %} 4 | 5 | {% set image = block.screenshots.one() %} 6 | 7 | 8 | {% if block.caption|length %}{{ block.caption }}{% endif %} 9 | -------------------------------------------------------------------------------- /templates/pages/_entry-type/pages.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | {# Hero #} 4 | {% include "_includes/hero" %} 5 | 6 | {% for block in entry.contentBuilder.collect() %} 7 | {% include "_blocks/" ~ block.type %} 8 | {% endfor %} 9 | -------------------------------------------------------------------------------- /templates/_blocks/fragmentBlock.twig: -------------------------------------------------------------------------------- 1 | {# get fragment entry #} 2 | {{ craft.app.config.general.devMode ? ('') | raw }} 3 | 4 | {% set entry = block.fragment.one() %} 5 | 6 | {% for block in entry.contentBuilder.all() %} 7 | {% include "_blocks/" ~ block.type %} 8 | {% endfor %} 9 | -------------------------------------------------------------------------------- /templates/_user-guide/blocks/copy.twig: -------------------------------------------------------------------------------- 1 | {% if block.sectionTitle|length %} 2 |

{{ block.sectionTitle }}

3 | {% endif %} 4 | 5 | {% if block.sectionSubtitle|length %} 6 |

{{ block.sectionSubtitle }}

7 | {% endif %} 8 | 9 | {% if block.copy %} 10 | {{ block.copy }} 11 | {% endif %} 12 | -------------------------------------------------------------------------------- /templates/pages/_news-category.twig: -------------------------------------------------------------------------------- 1 | {# homepage #} 2 | {% extends '_layout' %} 3 | 4 | {% block content %} 5 | {# 6 | load the entry news listing template 7 | so we can have categories with same layout and sprig pagination 8 | #} 9 | {% include "pages/_entry-type/newsListing" %} 10 | {% endblock %} -------------------------------------------------------------------------------- /templates/index.twig: -------------------------------------------------------------------------------- 1 | {# homepage 2 | 3 | home page template is at pages/_entry-type/home 4 | 5 | #} 6 | {% extends '_layout' %} 7 | 8 | {% set entry = craft.entries.slug('__home__').one() %} 9 | 10 | {% block content %} 11 | 12 |

home page template is at pages/_entry-type/home

13 | 14 | 15 | {% endblock %} -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | run(); 13 | -------------------------------------------------------------------------------- /public/assets/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "js/app.js": "js/app.js?v=b75450f7", 3 | "js/app.min.js": "js/app.min.js?v=c01f82c2", 4 | "js/plyr.min.js": "js/plyr.min.js?v=4fb2ab36", 5 | "css/app.css": "css/app.css?v=85da0f61", 6 | "css/cp-css.css": "css/cp-css.css?v=4640657e", 7 | "css/vendor.combined.css": "css/vendor.combined.css?v=387c74ea" 8 | } -------------------------------------------------------------------------------- /templates/_javascript/hero-swiper.js: -------------------------------------------------------------------------------- 1 | const swiper = new Swiper('.hero-swiper', { 2 | // Optional parameters 3 | loop: true, 4 | 5 | // pagination: { 6 | // el: ".home-pagination", 7 | // clickable:true, 8 | // }, 9 | navigation: { 10 | nextEl: ".swiper-button-next", 11 | prevEl: ".swiper-button-prev", 12 | }, 13 | }); -------------------------------------------------------------------------------- /templates/search/_search-item.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 |

{{ entry.title }}

5 | 6 |

7 | customize search-item template with more info as needed 8 |

9 |
-------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine On 3 | 4 | # Send would-be 404 requests to Craft 5 | RewriteCond %{REQUEST_FILENAME} !-f 6 | RewriteCond %{REQUEST_FILENAME} !-d 7 | RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC] 8 | RewriteRule (.+) index.php?p=$1 [QSA,L] 9 | 10 | -------------------------------------------------------------------------------- /src/img/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/project/fields/lightSwitch--ce14c790-b25f-464b-8ce8-0e949adc707b.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: lightSwitch 3 | instructions: null 4 | name: 'Light Switch' 5 | searchable: false 6 | settings: 7 | default: false 8 | offLabel: null 9 | onLabel: null 10 | translationKeyFormat: null 11 | translationMethod: site 12 | type: craft\fields\Lightswitch 13 | -------------------------------------------------------------------------------- /public/assets/images/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /craft: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | run(); 14 | exit($exitCode); 15 | -------------------------------------------------------------------------------- /config/htmlpurifier/Default.json: -------------------------------------------------------------------------------- 1 | { 2 | "Attr.AllowedFrameTargets": [ 3 | "_blank" 4 | ], 5 | "Attr.EnableID": true, 6 | "HTML.AllowedComments": [ 7 | "pagebreak" 8 | ], 9 | "HTML.ForbiddenAttributes": [ 10 | "style" 11 | ], 12 | "HTML.SafeIframe": true, 13 | "URI.SafeIframeRegexp": "%^(https?:)?//(www.youtube.com/embed/|player.vimeo.com/video/)%" 14 | } 15 | -------------------------------------------------------------------------------- /config/project/fields/hideFromNav--56f86cc6-5713-447f-8b10-e53f06ef42eb.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | contentColumnType: boolean 3 | handle: hideFromNav 4 | instructions: null 5 | name: 'Hide from Nav' 6 | searchable: false 7 | settings: 8 | default: false 9 | offLabel: null 10 | onLabel: null 11 | translationKeyFormat: null 12 | translationMethod: none 13 | type: craft\fields\Lightswitch 14 | -------------------------------------------------------------------------------- /config/environment-label.php: -------------------------------------------------------------------------------- 1 | true, 6 | 'labelText' => getenv('ENVIRONMENT'), 7 | 'prefixText' => getenv('CRAFT_ENV_LABEL_PREFIX'), 8 | 'suffixText' => null, 9 | 'labelColor' => getenv('CRAFT_ENV_LABEL_COLOR'), 10 | 'textColor' => getenv('CRAFT_ENV_LABEL_TEXT_COLOR'), 11 | 'targetSelector' => '#global-header:before', 12 | 13 | ]; -------------------------------------------------------------------------------- /config/project/fields/enableNoticeBar--5489ed3b-28c1-4a26-ac7e-97b0182e6652.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: vgclrinn 2 | contentColumnType: boolean 3 | handle: enableNoticeBar 4 | instructions: null 5 | name: 'Enable Notice Bar' 6 | searchable: false 7 | settings: 8 | default: false 9 | offLabel: null 10 | onLabel: null 11 | translationKeyFormat: null 12 | translationMethod: site 13 | type: craft\fields\Lightswitch 14 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Listen for Xdebug", 5 | "type": "php", 6 | "request": "launch", 7 | "hostname": "0.0.0.0", 8 | "port": 9003, 9 | "pathMappings": { 10 | "/var/www/html": "${workspaceFolder}" 11 | }, 12 | "preLaunchTask": "DDEV: Enable Xdebug", 13 | "postDebugTask": "DDEV: Disable Xdebug" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /src/js/app.js: -------------------------------------------------------------------------------- 1 | /* add javascript here */ 2 | 3 | function stopVideo() { 4 | console.log('please stop'); 5 | } 6 | 7 | 8 | // Change the second argument to your options: 9 | // https://github.com/sampotts/plyr/#options 10 | // const player = new Plyr('#player', {captions: {active: true}}); 11 | const players = Plyr.setup('.js-player'); 12 | 13 | // Expose player so it can be used from the console 14 | // window.player = player; -------------------------------------------------------------------------------- /config/project/fields/embed--3b9496a7-4539-4c28-91bc-3e51c68f4187.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: buzbghct 2 | handle: embed 3 | instructions: null 4 | name: Embed 5 | searchable: false 6 | settings: 7 | byteLimit: null 8 | charLimit: null 9 | code: true 10 | initialRows: 3 11 | multiline: true 12 | placeholder: null 13 | uiMode: normal 14 | translationKeyFormat: null 15 | translationMethod: site 16 | type: craft\fields\PlainText 17 | -------------------------------------------------------------------------------- /config/project/fields/input--c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: input 3 | instructions: null 4 | name: Input 5 | searchable: true 6 | settings: 7 | byteLimit: null 8 | charLimit: null 9 | code: false 10 | initialRows: 4 11 | multiline: false 12 | placeholder: null 13 | uiMode: normal 14 | translationKeyFormat: null 15 | translationMethod: site 16 | type: craft\fields\PlainText 17 | -------------------------------------------------------------------------------- /templates/_whitelist.twig: -------------------------------------------------------------------------------- 1 | {# 2 | // insert any whitelisted classes that are part of the cms 3 | // and not the templates 4 | #} 5 | 6 | {# BACKGROUND COLORS - for styleguide #} 7 | bg-grayBrand-light 8 | bg-grayBrand 9 | bg-white 10 | bg-black 11 | 12 | {# - copy and paste below into dropdown field 13 | Top & bottom 14 | Top Only 15 | Bottom Only 16 | No Padding 17 | #} 18 | section-y-padding 19 | section-t-padding 20 | section-b-padding 21 | section-no-padding -------------------------------------------------------------------------------- /templates/_user-guide/blocks/youtubeVideo.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | {% if block.videoTitle|length %} 5 |

{{ block.videoTitle }}

6 | {% endif %} 7 | 8 |
9 | {% set embedId = block.videoId %} 10 | 11 |
12 |
13 |
-------------------------------------------------------------------------------- /config/project/ckeditor/configs/170a124d-5ba5-43f5-a663-8f85be97b38b.yaml: -------------------------------------------------------------------------------- 1 | headingLevels: 2 | - 1 3 | - 2 4 | - 3 5 | - 4 6 | - 5 7 | - 6 8 | name: Default 9 | options: 10 | code: 11 | indentSequence: ' ' 12 | link: 13 | addTargetToExternalLinks: true 14 | toolbar: 15 | - sourceEditing 16 | - '|' 17 | - heading 18 | - '|' 19 | - blockQuote 20 | - codeBlock 21 | - bold 22 | - italic 23 | - bulletedList 24 | - numberedList 25 | - link 26 | - insertImage 27 | - mediaEmbed 28 | -------------------------------------------------------------------------------- /templates/_blocks/codeEmbed.twig: -------------------------------------------------------------------------------- 1 | {# use block layout #} 2 | {% extends '_blocks/_layout' %} 3 | 4 | {% block templateComment %} 5 | {{ craft.app.config.general.devMode ? ('') | raw }} 6 | {% endblock %} 7 | 8 | {# section background #} 9 | {% set background = 'bg-gray-100' %} 10 | 11 | {% block body %} 12 | 13 | {% if block.sectionTitle|length %} 14 |

{{ block.sectionTitle ?? "Video Block" }}

15 | {% endif %} 16 | 17 | {{ block.embed|raw }} 18 | 19 | {% endblock %} -------------------------------------------------------------------------------- /templates/_blocks/hero/basicHero.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 | {# hero content #} 5 |
6 |
7 |
8 |

{{ block.heroTitle ?? entry.title }}

9 |
10 |
11 |
12 | {# end hero content #} 13 |
-------------------------------------------------------------------------------- /config/project/ckeditor/configs/3e09420e-30db-49dd-9520-4775f6667303.yaml: -------------------------------------------------------------------------------- 1 | headingLevels: 2 | - 1 3 | - 2 4 | - 3 5 | - 4 6 | - 5 7 | - 6 8 | name: 'Site Basic' 9 | options: 10 | code: 11 | indentSequence: ' ' 12 | link: 13 | addTargetToExternalLinks: false 14 | decorators: 15 | openInNewTab: 16 | attributes: 17 | rel: 'noopener noreferrer' 18 | target: _blank 19 | label: 'Open in a new tab' 20 | mode: manual 21 | toolbar: 22 | - sourceEditing 23 | - bold 24 | -------------------------------------------------------------------------------- /public/assets/images/svg/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/_blocks/copy.twig: -------------------------------------------------------------------------------- 1 | {# use block layout #} 2 | {% extends '_blocks/_layout' %} 3 | 4 | {% block templateComment %} 5 | {{ craft.app.config.general.devMode ? ('') | raw }} 6 | {% endblock %} 7 | 8 | {# section background #} 9 | {% set background = 'bg-gray-50' %} 10 | 11 | {% block body %} 12 | 13 | {% if block.sectionTitle|length %} 14 |

{{ block.sectionTitle }}

15 | {% endif %} 16 |
17 | {{ block.copy }} 18 |
19 | 20 | {% endblock %} -------------------------------------------------------------------------------- /templates/pages/_entry-type/contactPage.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | {# Hero #} 4 | {% include "_includes/hero" %} 5 | 6 | 7 | 8 |
9 |
10 |
11 | {{ entry.copy }} 12 |
13 |
14 |
15 | 16 | {# contact form #} 17 | {{ sprig('_components/contact-form') }} 18 | {# {% include "_includes/contact-form" %} #} -------------------------------------------------------------------------------- /config/project/sections/userGuide--0784ad32-f952-40b1-9f6c-d0e67d502551.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - 475a351b-2442-4767-8ab6-1b39216d0c61 # User Guide 5 | handle: userGuide 6 | maxAuthors: 1 7 | name: 'User Guide' 8 | propagationMethod: all 9 | siteSettings: 10 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 11 | enabledByDefault: true 12 | hasUrls: true 13 | template: user-guide/_entry 14 | uriFormat: 'user-guide/{slug}' 15 | structure: 16 | maxLevels: null 17 | uid: a998bd9e-f13e-4af0-b105-e9cdf72d6151 18 | type: structure 19 | -------------------------------------------------------------------------------- /bootstrap.php: -------------------------------------------------------------------------------- 1 | safeLoad(); 18 | } 19 | -------------------------------------------------------------------------------- /public/assets/css/cp-css.css: -------------------------------------------------------------------------------- 1 | .blocks .matrixblock:not(.collapsed) { 2 | transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1); 3 | } 4 | .blocks .matrixblock:not(.collapsed):focus-within { 5 | box-shadow: 10px 10px 70px 40px rgba(0, 0, 0, 0.42); 6 | z-index: 2; 7 | transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1); 8 | } 9 | 10 | 11 | /* native matrix */ 12 | .matrixblock>.titlebar>.matrixblock-tabs .pane-tabs [role=tablist] [role=tab] { 13 | background:#b1cdef; 14 | } 15 | .pane-tabs [role=tablist] [role=tab].sel { 16 | background:#4b89d3 !important; /*#b1cdef*/ 17 | color: #fff; 18 | } -------------------------------------------------------------------------------- /config/project/fields/relatedEntries--5026b221-a48f-4868-9f48-07428068e77e.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: relatedEntries 3 | instructions: 'Select up to 3 entries' 4 | name: 'Related Entries' 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | branchLimit: null 9 | maintainHierarchy: false 10 | maxRelations: 3 11 | minRelations: 1 12 | selectionLabel: null 13 | showCardsInGrid: false 14 | showSiteMenu: false 15 | sources: '*' 16 | targetSiteId: null 17 | validateRelatedElements: false 18 | viewMode: list 19 | translationKeyFormat: null 20 | translationMethod: site 21 | type: craft\fields\Entries 22 | -------------------------------------------------------------------------------- /config/project/fields/fragment--aac80dd6-df34-4cd2-a92f-14debb37b911.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: fragment 3 | instructions: null 4 | name: Fragment 5 | searchable: true 6 | settings: 7 | allowSelfRelations: false 8 | branchLimit: null 9 | maintainHierarchy: false 10 | maxRelations: null 11 | minRelations: 1 12 | selectionLabel: null 13 | showCardsInGrid: false 14 | showSiteMenu: false 15 | sources: 16 | - 'section:ce27286a-7635-4494-9c9c-77f2d73352f4' # Fragments 17 | targetSiteId: null 18 | validateRelatedElements: false 19 | viewMode: list 20 | translationKeyFormat: null 21 | translationMethod: site 22 | type: craft\fields\Entries 23 | -------------------------------------------------------------------------------- /templates/_blocks/_layout.twig: -------------------------------------------------------------------------------- 1 | {# section background #} 2 | {% set background = background ?? 'bg-white' %} 3 | 4 | {% block templateComment %}{% endblock %} 5 | 6 | {# reveal blocks when they are 200px into the viewport #} 7 |
13 |
14 | 15 | {% block body %}{% endblock %} 16 | 17 |
18 |
-------------------------------------------------------------------------------- /config/project/fields/copyBasic--da3d7ec4-1d85-47ba-a517-6c81d94cc9d2.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: copyBasic 3 | instructions: null 4 | name: 'Copy Basic' 5 | searchable: true 6 | settings: 7 | availableTransforms: '' 8 | availableVolumes: '*' 9 | ckeConfig: 3e09420e-30db-49dd-9520-4775f6667303 # Site Basic 10 | createButtonLabel: null 11 | defaultTransform: null 12 | purifierConfig: null 13 | purifyHtml: true 14 | showUnpermittedFiles: false 15 | showUnpermittedVolumes: false 16 | showWordCount: true 17 | sourceEditingGroups: 18 | - __ADMINS__ 19 | wordLimit: null 20 | translationKeyFormat: null 21 | translationMethod: site 22 | type: craft\ckeditor\Field 23 | -------------------------------------------------------------------------------- /config/knock-knock.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'enabled' => false, 6 | 'loginPath' => 'knock-knock', 7 | //'template' => '', 8 | //'forcedRedirect' => '', 9 | 'password' => 'letmein', 10 | //'siteSettings' => [], 11 | 12 | //'checkInvalidLogins' => false, 13 | // 'invalidLoginWindowDuration' => '3600', 14 | // 'maxInvalidLogins' => 10, 15 | // 'allowIps' => '', 16 | // 'denyIps' => '', 17 | // 'useRemoteIp' => false, 18 | 19 | // 'protectedUrls' => '', 20 | // 'unprotectedUrls' => '', 21 | ], 22 | 'staging' => [ 23 | 'enabled' => true, 24 | ], 25 | ]; -------------------------------------------------------------------------------- /config/project/fields/userGuide--d974bf8d-647d-45f3-98be-0733d5e3e1ba.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | contentColumnType: string 3 | handle: userGuide 4 | instructions: null 5 | name: 'User Guide' 6 | searchable: false 7 | settings: 8 | entryTypes: 9 | - 0187ae10-82fa-43e8-ac5c-e8fa4f2e3b29 # Copy (user guide) 10 | - 4427e835-20ed-496b-9469-831bb0882185 11 | - a399fb79-90a6-48a0-be1f-38d2b8a81af5 # Video (user guide) 12 | - c4527788-b877-44f3-9a2d-071f696877fa # YouTube Video (user guide) 13 | maxEntries: null 14 | minEntries: null 15 | propagationKeyFormat: null 16 | propagationMethod: all 17 | viewMode: blocks 18 | translationKeyFormat: null 19 | translationMethod: site 20 | type: craft\fields\Matrix 21 | -------------------------------------------------------------------------------- /templates/_user-guide/_entry.twig: -------------------------------------------------------------------------------- 1 | 2 | {% include '_user-guide/styles' %} 3 | 4 |
5 | 6 |
7 |

This guide prepared by Caffeine Creations

8 | 9 |

For support email sean@caffeinecreations.ca or call 647-799-6330

10 |
11 |
12 | 13 | {% for block in entry.userGuide.all() %} 14 | {% include '_user-guide/blocks/' ~ block.type %} 15 | {% endfor %} 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /config/project/fields/copy--f90a85bd-91b2-462b-acb4-8f265ded647e.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: mevzfsyi 2 | contentColumnType: text 3 | handle: copy 4 | instructions: null 5 | name: Copy 6 | searchable: true 7 | settings: 8 | availableTransforms: '' 9 | availableVolumes: 10 | - 70f5d47b-4830-4d51-95fe-bc0f7ccc0670 # Uploads 11 | ckeConfig: 12f17257-6f1c-4e4c-837e-17ad76241a60 # Site 12 | columnType: text 13 | defaultTransform: null 14 | enableSourceEditingForNonAdmins: false 15 | purifierConfig: null 16 | purifyHtml: true 17 | showUnpermittedFiles: false 18 | showUnpermittedVolumes: false 19 | showWordCount: true 20 | wordLimit: null 21 | translationKeyFormat: null 22 | translationMethod: site 23 | type: craft\ckeditor\Field 24 | -------------------------------------------------------------------------------- /config/routes.php: -------------------------------------------------------------------------------- 1 | ' => ['template' => 'blog/_archive'], 15 | * 16 | * That example would match URIs such as `/blog/archive/2012`, and pass the 17 | * request along to the `blog/_archive` template, providing it a `year` variable 18 | * set to the value `2012`. 19 | */ 20 | 21 | return [ 22 | 23 | ]; 24 | -------------------------------------------------------------------------------- /templates/pages/_entry-type/newsListing.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 |
5 |
6 |

{{ entry.title ?? category.title }}

7 |
8 |
9 |
10 | 11 | {# make blog pagination reactive with sprig #} 12 | 13 | {{ sprig('_components/news-listing', { 'limit':6}) }} 14 | 15 | -------------------------------------------------------------------------------- /config/project/fields/slides--8c583e9a-a56d-486d-8550-e7eae61c8088.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: slides 3 | instructions: null 4 | name: Slides 5 | searchable: true 6 | settings: 7 | createButtonLabel: null 8 | defaultIndexViewMode: cards 9 | enableVersioning: false 10 | entryTypes: 11 | - 12 | __assoc__: 13 | - 14 | - uid 15 | - d399ecfb-7ec8-47d8-84ed-b8447e779a67 # Slide 16 | - 17 | - group 18 | - General 19 | includeTableView: false 20 | maxEntries: 5 21 | minEntries: null 22 | pageSize: 50 23 | propagationKeyFormat: null 24 | propagationMethod: none 25 | showCardsInGrid: false 26 | viewMode: cards 27 | translationKeyFormat: null 28 | translationMethod: site 29 | type: craft\fields\Matrix 30 | -------------------------------------------------------------------------------- /src/img/svg/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | App::env('CRAFT_APP_ID') ?: 'CraftCMS', 24 | ]; 25 | -------------------------------------------------------------------------------- /config/db.php: -------------------------------------------------------------------------------- 1 | App::env('DB_DSN') ?: null, 15 | 'driver' => App::env('DB_DRIVER'), 16 | 'server' => App::env('DB_SERVER'), 17 | 'port' => App::env('DB_PORT'), 18 | 'database' => App::env('DB_DATABASE'), 19 | 'user' => App::env('DB_USER'), 20 | 'password' => App::env('DB_PASSWORD'), 21 | 'schema' => App::env('DB_SCHEMA'), 22 | 'tablePrefix' => App::env('DB_TABLE_PREFIX'), 23 | 'charset' => 'utf8', 24 | 'collation' => 'utf8_unicode_ci', 25 | ]; 26 | -------------------------------------------------------------------------------- /public/assets/images/svg/chevron-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /config/project/fields/newsCategories--fbdde691-0df2-4e8e-b1a8-61a1f555fd0e.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: newsCategories 3 | instructions: null 4 | name: 'News Categories' 5 | searchable: true 6 | settings: 7 | allowSelfRelations: false 8 | branchLimit: null 9 | defaultPlacement: end 10 | maintainHierarchy: true 11 | maxRelations: null 12 | minRelations: null 13 | selectionLabel: null 14 | showCardsInGrid: false 15 | showSearchInput: true 16 | showSiteMenu: false 17 | showUnpermittedEntries: true 18 | showUnpermittedSections: true 19 | sources: 20 | - 'section:4b342e70-0223-4c29-9237-86a023f74f1b' # News Categories 21 | targetSiteId: null 22 | validateRelatedElements: false 23 | viewMode: list 24 | translationKeyFormat: null 25 | translationMethod: site 26 | type: craft\fields\Entries 27 | -------------------------------------------------------------------------------- /config/project/fields/noticeBarLocation--52f12f1b-ba11-48f3-985d-0ee6e2a6dc4e.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: kjjdtixf 2 | contentColumnType: string 3 | handle: noticeBarLocation 4 | instructions: null 5 | name: 'Notice Bar Location' 6 | searchable: false 7 | settings: 8 | columnType: string 9 | options: 10 | - 11 | __assoc__: 12 | - 13 | - label 14 | - 'Home Page Only' 15 | - 16 | - value 17 | - homePageOnly 18 | - 19 | - default 20 | - '1' 21 | - 22 | __assoc__: 23 | - 24 | - label 25 | - 'All Pages' 26 | - 27 | - value 28 | - allPages 29 | - 30 | - default 31 | - '' 32 | translationKeyFormat: null 33 | translationMethod: site 34 | type: craft\fields\Dropdown 35 | -------------------------------------------------------------------------------- /config/project/globalSets/fallback--415a954c-eb55-4533-9ffd-64b3eade9469.yaml: -------------------------------------------------------------------------------- 1 | fieldLayouts: 2 | f2c9fa24-b4e1-4a9b-ada3-9fdf262363ca: 3 | tabs: 4 | - 5 | elementCondition: null 6 | elements: 7 | - 8 | elementCondition: null 9 | fieldUid: 12c7de12-987a-4aa4-890f-ec5cde880851 # Fallback Image 10 | instructions: null 11 | label: null 12 | required: false 13 | tip: null 14 | type: craft\fieldlayoutelements\CustomField 15 | uid: 76442d36-9051-4053-bbc2-7da82de91b97 16 | userCondition: null 17 | warning: null 18 | width: 100 19 | name: Content 20 | uid: 17fe967b-d017-46eb-9f6b-84851017ec41 21 | userCondition: null 22 | handle: fallback 23 | name: Fallback 24 | sortOrder: 1 25 | -------------------------------------------------------------------------------- /config/project/sections/error404--29d88d99-dd38-43f6-9ac5-3438833c75ba.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - b312d78c-b490-46da-aeff-70a1be5a5505 # Error 404 5 | handle: error404 6 | maxAuthors: 1 7 | name: 'Error 404' 8 | previewTargets: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Primary entry page' 14 | - 15 | - urlFormat 16 | - '{url}' 17 | - 18 | - refresh 19 | - '1' 20 | propagationMethod: all 21 | siteSettings: 22 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 23 | enabledByDefault: true 24 | hasUrls: false 25 | template: null 26 | uriFormat: null 27 | b9fdef79-5b63-4932-a9aa-8d18f937e6d9: # Français 28 | enabledByDefault: true 29 | hasUrls: false 30 | template: null 31 | uriFormat: null 32 | type: single 33 | -------------------------------------------------------------------------------- /config/project/sections/fragments--ce27286a-7635-4494-9c9c-77f2d73352f4.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - c166cd47-6f64-49e0-b33d-6aceadb3fcc3 # Fragments 5 | handle: fragments 6 | maxAuthors: 1 7 | name: Fragments 8 | previewTargets: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Primary entry page' 14 | - 15 | - urlFormat 16 | - '{url}' 17 | - 18 | - refresh 19 | - '1' 20 | propagationMethod: all 21 | siteSettings: 22 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 23 | enabledByDefault: true 24 | hasUrls: false 25 | template: null 26 | uriFormat: null 27 | b9fdef79-5b63-4932-a9aa-8d18f937e6d9: # Français 28 | enabledByDefault: true 29 | hasUrls: false 30 | template: null 31 | uriFormat: null 32 | type: channel 33 | -------------------------------------------------------------------------------- /config/project/sections/noticeBar--408314ae-e32d-471b-a729-25f4ce759ac4.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - 5bca37e0-a30f-48fd-9fde-3105fb9d9738 # Notice Bar 5 | handle: noticeBar 6 | maxAuthors: 1 7 | name: 'Notice Bar' 8 | previewTargets: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Primary entry page' 14 | - 15 | - urlFormat 16 | - '{url}' 17 | - 18 | - refresh 19 | - '1' 20 | propagationMethod: all 21 | siteSettings: 22 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 23 | enabledByDefault: true 24 | hasUrls: false 25 | template: null 26 | uriFormat: null 27 | b9fdef79-5b63-4932-a9aa-8d18f937e6d9: # Français 28 | enabledByDefault: true 29 | hasUrls: false 30 | template: null 31 | uriFormat: null 32 | type: single 33 | -------------------------------------------------------------------------------- /config/project/sections/news--9c12e5ad-18e9-498f-bf50-489513409007.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - 51b9c3fc-be2a-4ef3-9f2c-66372327c604 # News 5 | handle: news 6 | maxAuthors: 1 7 | name: News 8 | previewTargets: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Primary entry page' 14 | - 15 | - urlFormat 16 | - '{url}' 17 | - 18 | - refresh 19 | - '1' 20 | propagationMethod: all 21 | siteSettings: 22 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 23 | enabledByDefault: true 24 | hasUrls: true 25 | template: news/_entry 26 | uriFormat: 'news/{slug}' 27 | b9fdef79-5b63-4932-a9aa-8d18f937e6d9: # Français 28 | enabledByDefault: true 29 | hasUrls: true 30 | template: news/_entry 31 | uriFormat: 'news/{slug}' 32 | type: channel 33 | -------------------------------------------------------------------------------- /config/project/fields/seo--149ec41c-d6de-4ae5-84db-08d285801dd1.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: seo 3 | instructions: null 4 | name: SEO 5 | searchable: false 6 | settings: 7 | elementDisplayPreviewType: google 8 | facebookEnabledFields: 9 | - seoPreview 10 | - ogTitle 11 | - ogDescription 12 | - ogImage 13 | facebookTabEnabled: '1' 14 | generalEnabledFields: 15 | - seoPreview 16 | - seoTitle 17 | - seoDescription 18 | - seoImage 19 | generalTabEnabled: '1' 20 | sitemapEnabledFields: 21 | - sitemapUrls 22 | - sitemapChangeFreq 23 | - sitemapPriority 24 | sitemapTabEnabled: '1' 25 | twitterEnabledFields: 26 | - seoPreview 27 | - twitterTitle 28 | - twitterDescription 29 | - twitterImage 30 | twitterTabEnabled: '1' 31 | translationKeyFormat: null 32 | translationMethod: site 33 | type: nystudio107\seomatic\fields\SeoSettings 34 | -------------------------------------------------------------------------------- /src/img/svg/chevron-double-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/img/svg/chevron-double-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /config/project/fields/hero--ab8abc7e-2a4d-4858-98ea-9a6954a434da.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: hero 3 | instructions: null 4 | name: Hero 5 | searchable: true 6 | settings: 7 | createButtonLabel: null 8 | defaultIndexViewMode: cards 9 | entryTypes: 10 | - 11 | __assoc__: 12 | - 13 | - uid 14 | - 120a7750-0967-496d-9315-bba6d83eb4b1 # Standard Hero 15 | - 16 | __assoc__: 17 | - 18 | - uid 19 | - 323e9af3-aa75-4f1c-82eb-370e40179f41 # Slider Hero 20 | - 21 | __assoc__: 22 | - 23 | - uid 24 | - b4d947dc-370e-4404-807b-b165534a1503 25 | includeTableView: false 26 | maxEntries: 1 27 | minEntries: 1 28 | pageSize: null 29 | propagationKeyFormat: null 30 | propagationMethod: none 31 | showCardsInGrid: false 32 | viewMode: blocks 33 | translationKeyFormat: null 34 | translationMethod: site 35 | type: craft\fields\Matrix 36 | -------------------------------------------------------------------------------- /templates/_blocks/callToAction.twig: -------------------------------------------------------------------------------- 1 | {# use block layout #} 2 | {% extends '_blocks/_layout' %} 3 | 4 | {% block templateComment %} 5 | {{ craft.app.config.general.devMode ? ('') | raw }} 6 | {% endblock %} 7 | 8 | {# section background #} 9 | {% set background = 'bg-gray-100' %} 10 | 11 | {% block body %} 12 | 13 |
14 | {% if block.sectionTitle|length %} 15 |

{{ block.sectionTitle }}

16 | {% endif %} 17 | {{ block.button.getLink({ 18 | class: 'btn', 19 | }) }} 20 | 21 | {# 22 | {{ tag('a', { 23 | text: block.buttonText ?? block.button.label, 24 | href: block.button 25 | })|attr({ 26 | class: 'btn', 27 | target: block.openInNewTab =='1' ? '_blank' : '_self' 28 | }) }} 29 | #} 30 |
31 | 32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /public/assets/images/svg/chevron-double-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /public/assets/images/svg/chevron-double-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /browsersync.config.js: -------------------------------------------------------------------------------- 1 | const homedir = require('os').homedir(); 2 | 3 | /* 4 | everything works fine, but https is not working and nothing I do seems to fix it 5 | */ 6 | 7 | module.exports = { 8 | proxy: 'https://craft-starter.ddev.site', 9 | host: '0.0.0.0', 10 | files: [ 11 | './templates/**/*.{html,twig}', 12 | './src/**/*.{css,js}', 13 | './public/**/*.{css,js}' 14 | ], 15 | // https:true, 16 | /* 17 | ? SSL-enabled for DDev. You have to copy the SSL cert to somewhere outside of Docker first. Run this at your project root: 18 | docker cp ddev-router:/etc/nginx/certs ~/tmp/DOMAIN-WITH-EXTENSION 19 | (From: https://stackoverflow.com/questions/59730898/cant-connect-browsersync-with-ddev-nginx-server-because-ssl-error): 20 | */ 21 | https: { 22 | key: homedir + "/tmp/certs/master.key", 23 | cert: homedir + "/tmp/certs/master.crt" 24 | }, 25 | secure: true, 26 | ui: false, 27 | open: 'local', 28 | notify: false, 29 | }; -------------------------------------------------------------------------------- /config/project/sections/pages--666b31c2-d6d5-4e80-b9aa-f57b66d5b54a.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - 4116f227-348c-4509-bc7a-6767a28fd40c # Contact Page 5 | - bb838d9b-476f-487c-8cc2-8e01b9423d92 # Pages 6 | - e3dea9df-426f-43a5-96fd-927882533aa9 # News Listing 7 | - ea7fe716-adee-4200-a8ca-15362418cd97 # Home 8 | handle: pages 9 | maxAuthors: 1 10 | name: Pages 11 | previewTargets: 12 | - 13 | __assoc__: 14 | - 15 | - label 16 | - 'Primary entry page' 17 | - 18 | - urlFormat 19 | - '{url}' 20 | - 21 | - refresh 22 | - '1' 23 | propagationMethod: all 24 | siteSettings: 25 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 26 | enabledByDefault: true 27 | hasUrls: true 28 | template: pages/_entry 29 | uriFormat: '{parent.uri}/{slug}' 30 | structure: 31 | maxLevels: null 32 | uid: 536c7846-2d54-4625-a65d-1a546df44223 33 | type: structure 34 | -------------------------------------------------------------------------------- /templates/404.twig: -------------------------------------------------------------------------------- 1 | {# homepage #} 2 | {% extends '_layout' %} 3 | 4 | 5 | {% set env = getenv('ENVIRONMENT') %} 6 | {% if env == 'production' %} 7 | {% block criticalCss %} 8 | 11 | {% endblock %} 12 | {% endif %} 13 | 14 | {% set entry = craft.entries.section('error404').one() %} 15 | 16 | {% block content %} 17 | 18 | {# hero block #} 19 | {# {% include '_includes/split-hero' %} #} 20 | {# end hero block #} 21 | 22 |
23 |
24 | 25 |
26 |

{{ entry.title }}

27 | 28 |
29 | {{ entry.text }} 30 |
31 |
32 | 33 |
34 |
35 | 36 | 37 | {% endblock %} -------------------------------------------------------------------------------- /config/project/sections/newsCategories--4b342e70-0223-4c29-9237-86a023f74f1b.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - ef488e30-b35e-4bf8-87a3-34f0f76b622f # News Categories 5 | handle: newsCategories 6 | maxAuthors: 1 7 | name: 'News Categories' 8 | previewTargets: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Primary entry page' 14 | - 15 | - urlFormat 16 | - '{url}' 17 | propagationMethod: all 18 | siteSettings: 19 | 1a78d395-d81a-4b77-8da7-30a49123bbee: # English 20 | enabledByDefault: true 21 | hasUrls: true 22 | template: pages/_news-category.twig 23 | uriFormat: 'news/category/{slug}' 24 | b9fdef79-5b63-4932-a9aa-8d18f937e6d9: # Français 25 | enabledByDefault: true 26 | hasUrls: true 27 | template: pages/_news-category.twig 28 | uriFormat: 'news/category/{slug}' 29 | structure: 30 | maxLevels: null 31 | uid: 6defae27-bbfa-4841-9096-f69c8b9f8e75 32 | type: structure 33 | -------------------------------------------------------------------------------- /config/project/ckeditor/configs/12f17257-6f1c-4e4c-837e-17ad76241a60.yaml: -------------------------------------------------------------------------------- 1 | headingLevels: 2 | - 2 3 | - 3 4 | name: Site 5 | options: 6 | code: 7 | indentSequence: ' ' 8 | link: 9 | addTargetToExternalLinks: false 10 | decorators: 11 | openInNewTab: 12 | attributes: 13 | rel: 'noopener noreferrer' 14 | target: _blank 15 | label: 'Open in a new tab' 16 | mode: manual 17 | style: 18 | definitions: 19 | - 20 | classes: 21 | - mb-20 22 | element: span 23 | name: 'Extra Bottom Margin' 24 | - 25 | classes: 26 | - mt-1 27 | - mb-0 28 | - leading-tight 29 | element: p 30 | name: 'Tight Paragraphs' 31 | toolbar: 32 | - sourceEditing 33 | - '|' 34 | - heading 35 | - '|' 36 | - style 37 | - '|' 38 | - bold 39 | - italic 40 | - bulletedList 41 | - numberedList 42 | - outdent 43 | - indent 44 | - link 45 | - alignment 46 | -------------------------------------------------------------------------------- /templates/sitemap.twig: -------------------------------------------------------------------------------- 1 | {# homepage 2 | 3 | home page template is at pages/_entry-type/home 4 | 5 | #} 6 | {% extends '_layout' %} 7 | 8 | {% set entry = craft.entries.slug('__home__').one() %} 9 | 10 | {% block content %} 11 | 12 |
13 |
14 |

Site Map

15 | 16 | 31 | 32 |
33 |
34 | 35 | 36 | {% endblock %} -------------------------------------------------------------------------------- /src/img/svg/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /public/assets/images/svg/chevron-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /config/project/fields/image2--7bf7da79-8f7d-4a1b-8129-121b24c0d99b.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: image2 3 | instructions: null 4 | name: 'Hero Image' 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | allowSubfolders: false 9 | allowUploads: true 10 | allowedKinds: null 11 | branchLimit: null 12 | defaultUploadLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 13 | defaultUploadLocationSubpath: null 14 | maintainHierarchy: false 15 | maxRelations: 1 16 | minRelations: null 17 | previewMode: full 18 | restrictFiles: false 19 | restrictLocation: true 20 | restrictedDefaultUploadSubpath: null 21 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 22 | restrictedLocationSubpath: hero 23 | selectionLabel: null 24 | showCardsInGrid: false 25 | showSiteMenu: false 26 | showUnpermittedFiles: false 27 | showUnpermittedVolumes: false 28 | sources: '*' 29 | targetSiteId: null 30 | validateRelatedElements: false 31 | viewMode: large 32 | translationKeyFormat: null 33 | translationMethod: site 34 | type: craft\fields\Assets 35 | -------------------------------------------------------------------------------- /config/project/fields/image--b2f53aa5-81a3-466c-af2d-e30dab4ed3d8.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: image 3 | instructions: null 4 | name: Image 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | allowSubfolders: false 9 | allowUploads: true 10 | allowedKinds: 11 | - image 12 | branchLimit: null 13 | defaultUploadLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 14 | defaultUploadLocationSubpath: null 15 | maintainHierarchy: false 16 | maxRelations: null 17 | minRelations: null 18 | previewMode: full 19 | restrictFiles: true 20 | restrictLocation: false 21 | restrictedDefaultUploadSubpath: null 22 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 23 | restrictedLocationSubpath: null 24 | selectionLabel: null 25 | showCardsInGrid: false 26 | showSiteMenu: false 27 | showUnpermittedFiles: false 28 | showUnpermittedVolumes: false 29 | sources: '*' 30 | targetSiteId: null 31 | validateRelatedElements: false 32 | viewMode: large 33 | translationKeyFormat: null 34 | translationMethod: site 35 | type: craft\fields\Assets 36 | -------------------------------------------------------------------------------- /templates/_includes/language-switcher.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | 4 | {# https://craftcms.stackexchange.com/a/14306/193 #} 5 | 6 | {% set currentLanguage = currentSite.language %} 7 | 8 | {# Decide which languages should be omitted from language links #} 9 | {% set languageExceptions = currentSite.language %} 10 | {% set otherLocales = craft.app.sites.getAllSites() %} 11 | 12 | 13 | {% for site in otherLocales %} 14 | {% if site.id != currentSite.id %} 15 | {% if entry is defined %} 16 | {% set localeEntry = craft.entries.id(entry.id).siteId(site.id).one() %} 17 | 18 | {% elseif event is defined %} 19 | {% set localeEntry = craft.calendar.event(event.id) %} 20 | {% else %} 21 | {# homepage #} 22 | {% set localeEntry = craft.entries.id('2').siteId(site.id).one() %} 23 | {% endif %} 24 | 25 | {% if localeEntry.siteId is defined %} 26 | {# build url for events page #} 27 | 28 | {{ site.name }} 29 | 30 | {% endif %} 31 | {% endif %} 32 | {% endfor %} -------------------------------------------------------------------------------- /config/project/fields/screenshots--25e2157e-9a82-41cd-970f-4fc58cb3a835.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: screenshots 3 | instructions: null 4 | name: Screenshots 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | allowSubfolders: false 9 | allowUploads: true 10 | allowedKinds: 11 | - image 12 | branchLimit: null 13 | defaultUploadLocationSource: 'volume:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 14 | defaultUploadLocationSubpath: null 15 | maintainHierarchy: false 16 | maxRelations: 1 17 | minRelations: null 18 | previewMode: full 19 | restrictFiles: true 20 | restrictLocation: false 21 | restrictedDefaultUploadSubpath: null 22 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 23 | restrictedLocationSubpath: null 24 | selectionLabel: null 25 | showCardsInGrid: false 26 | showSiteMenu: true 27 | showUnpermittedFiles: false 28 | showUnpermittedVolumes: false 29 | sources: 30 | - 'volume:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 31 | targetSiteId: null 32 | validateRelatedElements: false 33 | viewMode: large 34 | translationKeyFormat: null 35 | translationMethod: site 36 | type: craft\fields\Assets 37 | -------------------------------------------------------------------------------- /config/project/fields/listingImage--c33fedfd-ec76-45db-93dc-a12697e4a2aa.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: listingImage 3 | instructions: null 4 | name: 'Listing Image' 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | allowSubfolders: false 9 | allowUploads: false 10 | allowedKinds: 11 | - image 12 | branchLimit: null 13 | defaultUploadLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 14 | defaultUploadLocationSubpath: null 15 | maintainHierarchy: false 16 | maxRelations: 1 17 | minRelations: null 18 | previewMode: full 19 | restrictFiles: true 20 | restrictLocation: false 21 | restrictedDefaultUploadSubpath: null 22 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 23 | restrictedLocationSubpath: null 24 | selectionLabel: null 25 | showCardsInGrid: false 26 | showSiteMenu: false 27 | showUnpermittedFiles: false 28 | showUnpermittedVolumes: false 29 | sources: 30 | - 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 31 | targetSiteId: null 32 | validateRelatedElements: false 33 | viewMode: large 34 | translationKeyFormat: null 35 | translationMethod: site 36 | type: craft\fields\Assets 37 | -------------------------------------------------------------------------------- /config/project/fields/videoUpload--6f74be98-1b1b-470e-a96a-727b01e0b225.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: videoUpload 3 | instructions: null 4 | name: 'Video Upload' 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | allowSubfolders: false 9 | allowUploads: true 10 | allowedKinds: 11 | - video 12 | branchLimit: null 13 | defaultUploadLocationSource: 'volume:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 14 | defaultUploadLocationSubpath: null 15 | maintainHierarchy: false 16 | maxRelations: 1 17 | minRelations: null 18 | previewMode: full 19 | restrictFiles: true 20 | restrictLocation: false 21 | restrictedDefaultUploadSubpath: null 22 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 23 | restrictedLocationSubpath: null 24 | selectionLabel: null 25 | showCardsInGrid: false 26 | showSiteMenu: true 27 | showUnpermittedFiles: false 28 | showUnpermittedVolumes: false 29 | sources: 30 | - 'volume:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 31 | targetSiteId: null 32 | validateRelatedElements: false 33 | viewMode: list 34 | translationKeyFormat: null 35 | translationMethod: site 36 | type: craft\fields\Assets 37 | -------------------------------------------------------------------------------- /config/project/fields/backgroundImage--cc618569-5c0e-4ff7-9b4a-2fe9ed27af1f.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: backgroundImage 3 | instructions: null 4 | name: 'Background Image' 5 | searchable: false 6 | settings: 7 | allowSelfRelations: false 8 | allowSubfolders: false 9 | allowUploads: true 10 | allowedKinds: 11 | - image 12 | branchLimit: null 13 | defaultUploadLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 14 | defaultUploadLocationSubpath: null 15 | maintainHierarchy: false 16 | maxRelations: 1 17 | minRelations: null 18 | previewMode: full 19 | restrictFiles: true 20 | restrictLocation: false 21 | restrictedDefaultUploadSubpath: null 22 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 23 | restrictedLocationSubpath: null 24 | selectionLabel: null 25 | showCardsInGrid: false 26 | showSiteMenu: false 27 | showUnpermittedFiles: false 28 | showUnpermittedVolumes: false 29 | sources: 30 | - 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 31 | targetSiteId: null 32 | validateRelatedElements: false 33 | viewMode: list 34 | translationKeyFormat: null 35 | translationMethod: site 36 | type: craft\fields\Assets 37 | -------------------------------------------------------------------------------- /src/img/svg/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /config/project/fields/padding--127f0d67-cfaf-4e5d-b3f8-111b7fda6f64.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: mjnbzisp 2 | handle: padding 3 | instructions: null 4 | name: Padding 5 | searchable: false 6 | settings: 7 | customOptions: false 8 | options: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Top & bottom' 14 | - 15 | - value 16 | - section-y-padding 17 | - 18 | - default 19 | - '1' 20 | - 21 | __assoc__: 22 | - 23 | - label 24 | - 'Top Only' 25 | - 26 | - value 27 | - section-t-padding 28 | - 29 | - default 30 | - '' 31 | - 32 | __assoc__: 33 | - 34 | - label 35 | - 'Bottom Only' 36 | - 37 | - value 38 | - section-b-padding 39 | - 40 | - default 41 | - '' 42 | - 43 | __assoc__: 44 | - 45 | - label 46 | - 'No Padding' 47 | - 48 | - value 49 | - section-no-padding 50 | - 51 | - default 52 | - '' 53 | translationKeyFormat: null 54 | translationMethod: site 55 | type: craft\fields\Dropdown 56 | -------------------------------------------------------------------------------- /config/project/fields/fallbackImage--12c7de12-987a-4aa4-890f-ec5cde880851.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | contentColumnType: string 3 | handle: fallbackImage 4 | instructions: null 5 | name: 'Fallback Image' 6 | searchable: false 7 | settings: 8 | allowSelfRelations: false 9 | allowSubfolders: false 10 | allowUploads: true 11 | allowedKinds: 12 | - image 13 | branchLimit: null 14 | defaultUploadLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 15 | defaultUploadLocationSubpath: null 16 | localizeRelations: true 17 | maintainHierarchy: false 18 | maxRelations: 1 19 | minRelations: null 20 | previewMode: full 21 | restrictFiles: true 22 | restrictLocation: false 23 | restrictedDefaultUploadSubpath: null 24 | restrictedLocationSource: 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 25 | restrictedLocationSubpath: null 26 | selectionLabel: null 27 | showSiteMenu: false 28 | showUnpermittedFiles: false 29 | showUnpermittedVolumes: false 30 | sources: 31 | - 'volume:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 32 | targetSiteId: null 33 | validateRelatedElements: false 34 | viewMode: large 35 | translationKeyFormat: null 36 | translationMethod: site 37 | type: craft\fields\Assets 38 | -------------------------------------------------------------------------------- /config/project/entryTypes/basicHero--b4d947dc-370e-4404-807b-b165534a1503.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | dc49b215-dcb8-4177-9ecd-36ece2b038a7: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | dateAdded: '2025-01-27T11:45:28-05:00' 10 | elementCondition: null 11 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 12 | handle: heroTitle 13 | includeInCards: true 14 | instructions: 'If empty page title will be used' 15 | label: 'Hero Title' 16 | providesThumbs: false 17 | required: false 18 | tip: null 19 | type: craft\fieldlayoutelements\CustomField 20 | uid: 2d611c9f-ce5d-4fb3-89b7-6cbbac684b4a 21 | userCondition: null 22 | warning: null 23 | width: 100 24 | name: Content 25 | uid: eaada003-5ead-470a-9054-8417d845e9be 26 | userCondition: null 27 | handle: basicHero 28 | hasTitleField: false 29 | icon: null 30 | name: 'Basic Hero' 31 | showSlugField: true 32 | showStatusField: true 33 | slugTranslationKeyFormat: null 34 | slugTranslationMethod: site 35 | titleFormat: null 36 | titleTranslationKeyFormat: null 37 | titleTranslationMethod: site 38 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /config/project/entryTypes/fragmentBlock--48d0d0b8-2e48-4232-8b09-a401c6493902.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 9a7c5f55-c3f5-4e6e-9066-4cae24a1e8fc: 4 | cardView: 5 | - 'layoutElement:36176e49-f347-4d1d-9c9f-43876e808579' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T17:15:33+00:00' 12 | elementCondition: null 13 | fieldUid: aac80dd6-df34-4cd2-a92f-14debb37b911 # Fragment 14 | handle: null 15 | includeInCards: true 16 | instructions: null 17 | label: Fragment 18 | providesThumbs: false 19 | required: true 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: 36176e49-f347-4d1d-9c9f-43876e808579 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | name: Content 27 | uid: 9ac485a3-5145-4704-b46f-add6c7126e86 28 | userCondition: null 29 | handle: fragmentBlock 30 | hasTitleField: false 31 | icon: puzzle-piece 32 | name: 'Fragment Block' 33 | showSlugField: true 34 | showStatusField: true 35 | slugTranslationKeyFormat: null 36 | slugTranslationMethod: site 37 | titleFormat: null 38 | titleTranslationKeyFormat: null 39 | titleTranslationMethod: site 40 | -------------------------------------------------------------------------------- /templates/_macros.twig: -------------------------------------------------------------------------------- 1 | {% macro emailLinks(text, class) %} 2 | {# v1 #} 3 | {% apply spaceless %} 4 | {% set text = text|replace('/([a-zA-Z0-9_.+-]+)+@([a-zA-Z0-9-]+.[a-zA-Z]+)/', ''~ '\\1@\\2' ~'') %} 5 | {{text|raw}} 6 | {% endapply %} 7 | {% endmacro %} 8 | {# {{ macros.emailLinks("me@domain.com", "className") }} #} 9 | 10 | {# active segment #} 11 | {% macro is_active(segment) %} 12 | {% if craft.app.request.segments | first == segment %} 13 | active 14 | {% endif %} 15 | {% endmacro %} 16 | 17 | 18 | {# 19 | # Phone Number formatter 20 | # strip - . () and spaces from phone numbers 21 | # outputs a tel: link 22 | # @param {phoneNumber} 23 | # @param {className} - optional 24 | # currently untested 25 | #} 26 | {% macro phone(phoneNumber, className) %} 27 | {{ phoneNumber }} 28 | {% endmacro %} 29 | {# {{ macros.phone('1-705-000.0000', 'no-underline') }} #} 30 | 31 | 32 | 33 | {# different formatting for en/fr dates #} 34 | {% macro biDate(date) %} 35 | {% if currentSite.language =="en" %} 36 | {{ date|date("F d, Y") }} 37 | {% endif %} 38 | 39 | {% if currentSite.language =="fr" %} 40 | {{ date|date("d F Y") }} 41 | {% endif %} 42 | {% endmacro %} 43 | -------------------------------------------------------------------------------- /config/project/fields/contentBuilder--77af5a62-d057-494a-91ac-9edf65b6b266.yaml: -------------------------------------------------------------------------------- 1 | columnSuffix: null 2 | handle: contentBuilder 3 | instructions: null 4 | name: 'Content Builder' 5 | searchable: true 6 | settings: 7 | createButtonLabel: null 8 | defaultIndexViewMode: cards 9 | entryTypes: 10 | - 11 | __assoc__: 12 | - 13 | - uid 14 | - 48d0d0b8-2e48-4232-8b09-a401c6493902 # Fragment Block 15 | - 16 | __assoc__: 17 | - 18 | - uid 19 | - 57a74cde-de83-4b69-88ff-a4472daac7f7 # Call To Action 20 | - 21 | __assoc__: 22 | - 23 | - uid 24 | - 2456a57a-605c-4af0-9611-f48ca631ff0a 25 | - 26 | __assoc__: 27 | - 28 | - uid 29 | - 70339fac-606b-4827-9a19-c97a3f0bd59c # Copy 30 | - 31 | __assoc__: 32 | - 33 | - uid 34 | - a983660a-2b2e-413f-a79c-498b502b4f85 # Code Embed 35 | - 36 | __assoc__: 37 | - 38 | - uid 39 | - c951c9a0-1cca-4210-bef8-2d3d0446e841 # Related Entries 40 | includeTableView: false 41 | maxEntries: null 42 | minEntries: null 43 | pageSize: null 44 | propagationKeyFormat: null 45 | propagationMethod: none 46 | showCardsInGrid: false 47 | viewMode: blocks 48 | translationKeyFormat: null 49 | translationMethod: site 50 | type: craft\fields\Matrix 51 | -------------------------------------------------------------------------------- /config/project/volumes/userGuide--d19b4314-0267-4e95-9e63-2462a334eea1.yaml: -------------------------------------------------------------------------------- 1 | fieldLayouts: 2 | eb53ac7e-fc3b-4522-a428-91addf2ec44f: 3 | tabs: 4 | - 5 | elementCondition: null 6 | elements: 7 | - 8 | autocapitalize: true 9 | autocomplete: false 10 | autocorrect: true 11 | class: null 12 | disabled: false 13 | elementCondition: null 14 | id: null 15 | inputType: null 16 | instructions: null 17 | label: null 18 | max: null 19 | min: null 20 | name: null 21 | orientation: null 22 | placeholder: null 23 | readonly: false 24 | requirable: false 25 | size: null 26 | step: null 27 | tip: null 28 | title: null 29 | type: craft\fieldlayoutelements\assets\AssetTitleField 30 | uid: 541ec78b-792f-4edb-a994-06a8971aa7b5 31 | userCondition: null 32 | warning: null 33 | width: 100 34 | name: Content 35 | uid: b560c7ff-4231-406d-975b-a98c765ba8df 36 | userCondition: null 37 | fs: userGuide 38 | handle: userGuide 39 | name: 'User Guide' 40 | sortOrder: 2 41 | titleTranslationKeyFormat: null 42 | titleTranslationMethod: site 43 | transformFs: null 44 | transformSubpath: '' 45 | -------------------------------------------------------------------------------- /src/js/generate-manifest.js: -------------------------------------------------------------------------------- 1 | // src/js/generate-manifest.js 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const crypto = require('crypto'); 5 | 6 | function generateHash(filePath) { 7 | const fileBuffer = fs.readFileSync(filePath); 8 | const hashSum = crypto.createHash('md5'); 9 | hashSum.update(fileBuffer); 10 | return hashSum.digest('hex').slice(0, 8); 11 | } 12 | 13 | function generateManifest() { 14 | const publicDir = path.join(__dirname, '../../public/assets'); 15 | const manifest = {}; 16 | 17 | // Process JS files 18 | const jsFiles = fs.readdirSync(path.join(publicDir, 'js')) 19 | .filter(file => file.endsWith('.js')); 20 | 21 | jsFiles.forEach(file => { 22 | const filePath = path.join(publicDir, 'js', file); 23 | const hash = generateHash(filePath); 24 | manifest[`js/${file}`] = `js/${file}?v=${hash}`; 25 | }); 26 | 27 | // Process CSS files 28 | const cssFiles = fs.readdirSync(path.join(publicDir, 'css')) 29 | .filter(file => file.endsWith('.css')); 30 | 31 | cssFiles.forEach(file => { 32 | const filePath = path.join(publicDir, 'css', file); 33 | const hash = generateHash(filePath); 34 | manifest[`css/${file}`] = `css/${file}?v=${hash}`; 35 | }); 36 | 37 | // Write manifest file 38 | fs.writeFileSync( 39 | path.join(publicDir, 'manifest.json'), 40 | JSON.stringify(manifest, null, 2) 41 | ); 42 | } 43 | 44 | generateManifest(); -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # The environment Craft is currently running in (dev, staging, production, etc.) 2 | ENVIRONMENT=dev 3 | 4 | # The application ID used to to uniquely store session and cache data, mutex locks, and more 5 | APP_ID= 6 | 7 | # The secure key Craft will use for hashing and encrypting data 8 | SECURITY_KEY= 9 | 10 | # Database Configuration 11 | DB_DRIVER=mysql 12 | DB_SERVER=db 13 | DB_PORT=3306 14 | DB_DATABASE=db 15 | DB_USER=db 16 | DB_PASSWORD=db 17 | DB_SCHEMA= 18 | DB_TABLE_PREFIX= 19 | 20 | CRAFT_CP_TRIGGER=access 21 | 22 | SITE_NAME="Starter Site Name" 23 | SITE_NAME_EN="Starter Site Name (en)" 24 | SITE_NAME_FR="Starter Site Name (fr)" 25 | 26 | PRIMARY_SITE_URL= 27 | # SITE_URL_EN=https://craft-starter.ddev.site/en 28 | # SITE_URL_FR=https://craft-starter.ddev.site/fr 29 | 30 | # site path 31 | SITE_PATH=/var/www/html/public 32 | 33 | # uploads path 34 | ASSET_BASE_PATH=/var/www/html/public/uploads 35 | ASSET_BASE_URL=https://craft-starter.ddev.site/uploads 36 | 37 | # Email Settings 38 | TO_EMAIL=none@domain.com 39 | FROM_EMAIL=none@domain.com 40 | SYSTEM_EMAIL=none@domain.com 41 | SENDER_NAME=test 42 | # email hostname 43 | EMAIL_HOSTNAME=localhost 44 | # email port 45 | EMAIL_PORT=1025 46 | # email username 47 | EMAIL_USERNAME=null 48 | # email password 49 | EMAIL_PASSWORD=null 50 | 51 | #Environment Label 52 | CRAFT_ENV_LABEL_PREFIX=" Local Site" 53 | CRAFT_ENV_LABEL_COLOR="#FFFF00" 54 | CRAFT_ENV_LABEL_TEXT_COLOR="#FF0000" -------------------------------------------------------------------------------- /templates/_includes/notice-bar.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | {% set notice = craft.entries.section('noticeBar').one() %} 4 | 5 | {% if notice.enableNoticeBar == '1' 6 | and ( notice.noticeBarLocation !="homePageOnly" or ( entry.slug == '__home__' ) ) 7 | %} 8 | 9 |
10 |
14 |
15 |
16 |
17 | {{ notice.text|retcon([ 18 | ['attr', 'p', { class: 'm-0 text-sm' }] 19 | ]) }} 20 |
21 | {% if notice.button|length %} 22 | {{ notice.button.getLink({ 23 | class: 'btn mx-8', 24 | }) }} 25 | {% endif %} 26 | 32 | 33 |
34 |
35 |
36 |
37 | 38 | {% endif %} 39 | -------------------------------------------------------------------------------- /templates/_user-guide/blocks/video.twig: -------------------------------------------------------------------------------- 1 | {% if block.sectionTitle|length %} 2 |

{{ block.sectionTitle }}

3 | {% endif %} 4 | 5 | {% if block.sectionSubtitle|length %} 6 |

{{ block.sectionSubtitle }}

7 | {% endif %} 8 | 9 | {% set video = block.videoUpload.one() %} 10 | 14 | 15 |

Download Video

-------------------------------------------------------------------------------- /config/project/entryTypes/newsCategories--ef488e30-b35e-4bf8-87a3-34f0f76b622f.yaml: -------------------------------------------------------------------------------- 1 | color: yellow 2 | fieldLayouts: 3 | b3390d68-f84f-46fa-9b06-88b3dc039727: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | disabled: false 14 | elementCondition: null 15 | id: null 16 | includeInCards: false 17 | inputType: null 18 | instructions: null 19 | label: null 20 | max: null 21 | min: null 22 | name: null 23 | orientation: null 24 | placeholder: null 25 | providesThumbs: false 26 | readonly: false 27 | requirable: false 28 | size: null 29 | step: null 30 | tip: null 31 | title: null 32 | type: craft\fieldlayoutelements\TitleField 33 | uid: a9b04cad-9f4c-4de5-b25a-39852ba6691e 34 | userCondition: null 35 | warning: null 36 | width: 100 37 | name: Content 38 | uid: 14887279-63d4-41f5-880f-5923f8d02a1d 39 | userCondition: null 40 | handle: newsCategories 41 | hasTitleField: true 42 | icon: icons 43 | name: 'News Categories' 44 | showSlugField: true 45 | showStatusField: true 46 | slugTranslationKeyFormat: '' 47 | slugTranslationMethod: site 48 | titleFormat: '' 49 | titleTranslationKeyFormat: '' 50 | titleTranslationMethod: site 51 | -------------------------------------------------------------------------------- /templates/_blocks/video.twig: -------------------------------------------------------------------------------- 1 | {# use block layout #} 2 | {% extends '_blocks/_layout' %} 3 | 4 | {% block templateComment %} 5 | {{ craft.app.config.general.devMode ? ('') | raw }} 6 | {% endblock %} 7 | 8 | {# section background #} 9 | {% set background = 'bg-gray-200' %} 10 | 11 | {% block body %} 12 | {% if block.sectionTitle|length %} 13 |

{{ block.sectionTitle ?? "Video Block" }}

14 | {% endif %} 15 | 16 | {# 17 | Override the default colour theme in Plyr: 18 | https://github.com/sampotts/plyr#customizing-the-css 19 | 20 | // this can be done in the @layer base of src/css/app.css 21 | #} 22 | 23 | {# 24 | // javascript in src/js/app.js 25 | #} 26 | 27 | 28 | 29 |
30 | 31 | {# Assume Vimeo: #} 32 | {% if 'vimeo' in block.videoLink %} 33 |
37 |
38 | {% else %} 39 | 40 | {# Assume YouTube: #} 41 |
45 | 46 | {% endif %} 47 | 48 | {% endblock %} -------------------------------------------------------------------------------- /config/assetrev.php: -------------------------------------------------------------------------------- 1 | 'manifest|querystring|passthrough', 10 | 11 | // The strategies you'd like to try to rev your asset filename. You can 12 | // provide the name of a class that implements `StrategyContact` or a 13 | // custom closure. The defaults should cater to most requirements. 14 | 15 | 'strategies' => [ 16 | 'manifest' => \club\assetrev\utilities\strategies\ManifestFileStrategy::class, 17 | 'querystring' => \club\assetrev\utilities\strategies\QueryStringStrategy::class, 18 | 'passthrough' => function ($filename, $config) { 19 | return $filename; 20 | }, 21 | ], 22 | 23 | // The path to your asset manifest; most likely generated by a task runner 24 | // such as Gulp or Grunt. The path will be relative to your Craft base 25 | // directory, unless you supply an absolute path. 26 | 27 | 'manifestPath' => 'public/assets/mix-manifest.json', 28 | 29 | // The path where your built asset files can be found. Required for query 30 | // string creation. Again, this is relative to your Craft base directory, 31 | // unless you supply an absolute path. 32 | 33 | 'assetsBasePath' => '@webroot/assets', 34 | 35 | // A prefix to apply to your asset filenames when they are output. You would 36 | // likely want to set this if the paths in your manifest file are going to 37 | // be different to the final intended asset URL. 38 | 39 | 'assetUrlPrefix' => '/assets', 40 | 41 | ]; 42 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require('tailwindcss/colors') 2 | 3 | module.exports = { 4 | content: [ 5 | './templates/**/*.{html,twig,js}', 6 | './src/**/*.{vue,js,jsx}', 7 | ], 8 | darkMode:'class', 9 | theme: { 10 | container: { 11 | center: true, 12 | padding:'1rem', 13 | }, 14 | colors: { 15 | grayBrand: { 16 | light: '#DADADA', 17 | DEFAULT: '#373F41', 18 | }, 19 | 'white': { 20 | DEFAULT: '#FFFFFF', 21 | }, 22 | 'black': { 23 | DEFAULT: '#000000', 24 | }, 25 | transparent: 'transparent', 26 | current: 'currentColor', 27 | green: colors.green, 28 | pink: colors.pink, 29 | red: colors.red, 30 | gray: colors.gray, 31 | }, 32 | extend: { 33 | fontFamily: { 34 | 'default':['HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', 'Helvetica', 'Arial', 'Lucida Grande', 'sans-serif'], 35 | }, 36 | fontSize: { 37 | }, 38 | typography: (theme) => ({ 39 | DEFAULT: { 40 | css: { 41 | maxWidth: '100%', 42 | color: theme('colors.gray.900'), 43 | a: { 44 | color: theme('colors.red.500'), 45 | '&:hover': { 46 | color: theme('colors.red.700'), 47 | textDecoration: 'none', 48 | }, 49 | }, 50 | }, 51 | }, 52 | }), 53 | //https://github.com/tailwindlabs/tailwindcss-container-queries 54 | // containers: { 55 | // '2xs': '16rem', 56 | // }, 57 | }, 58 | }, 59 | plugins: [ 60 | // require('@tailwindcss/container-queries'), 61 | require('@tailwindcss/typography'), 62 | ], 63 | } 64 | -------------------------------------------------------------------------------- /templates/_includes/footer.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | -------------------------------------------------------------------------------- /templates/_components/news-listing.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | {% set seg2 = craft.app.request.getSegment('2') %} 4 | {% set seg3 = craft.app.request.getSegment('3') %} 5 | 6 | 7 | {# set variable for sprig to hook into with default for first page load #} 8 | {% set page = page ?? 1 %} 9 | {% set category = category ?? '' %} 10 | {# 11 | // need above values in hidden inputs for persistent state 12 | // https://github.com/putyourlightson/craft-sprig/issues/71#issuecomment-745388432 13 | #} 14 | {{ hiddenInput('page', page) }} 15 | {{ hiddenInput('category', category) }} 16 | 17 | {% set params = { section: 'news', limit: limit } %} 18 | 19 | {# filter by category if on category page #} 20 | {% set blogCategory = craft.entries.slug(category).one() %} 21 | {% if category != '' %} 22 | {% set params = params | merge({ relatedTo: blogCategory }) %} 23 | {% endif %} 24 | 25 | {% set entryQuery = craft.entries(params) %} 26 | 27 | {# Paginates the entry query given the current page #} 28 | {% set pageInfo = sprig.paginate(entryQuery, page) %} 29 | {% set entries = pageInfo.pageResults %} 30 | 31 |
32 |
33 |
34 | 35 | {% for entry in entries %} 36 | 37 | {% include "_includes/news-listing-article" %} 38 | {% endfor %} 39 | 40 |
41 |
42 | 43 | {# pagination #} 44 | 45 | {% include "_components/pagination" %} 46 | 47 |
48 | 49 | {% do sprig.pushUrl('?' ~ {category: category, page: page,}|url_encode) %} -------------------------------------------------------------------------------- /config/project/entryTypes/image--4427e835-20ed-496b-9469-831bb0882185.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 63e4bf4a-e003-4c1d-9c48-c8e7d9b987d0: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | dateAdded: '2025-01-27T11:45:28-05:00' 10 | elementCondition: null 11 | fieldUid: 25e2157e-9a82-41cd-970f-4fc58cb3a835 # Screenshots 12 | handle: null 13 | includeInCards: false 14 | instructions: null 15 | label: Screenshots 16 | providesThumbs: true 17 | required: false 18 | tip: null 19 | type: craft\fieldlayoutelements\CustomField 20 | uid: 14f81187-aacb-4e3e-87fe-af1a34be64a3 21 | userCondition: null 22 | warning: null 23 | width: 100 24 | - 25 | dateAdded: '2025-01-27T11:45:28-05:00' 26 | elementCondition: null 27 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 28 | handle: caption 29 | includeInCards: true 30 | instructions: null 31 | label: Caption 32 | providesThumbs: false 33 | required: false 34 | tip: null 35 | type: craft\fieldlayoutelements\CustomField 36 | uid: 1eba92eb-e0ad-42f2-a284-4a25b7f69aae 37 | userCondition: null 38 | warning: null 39 | width: 100 40 | name: Content 41 | uid: 1f728f66-64a4-4bcc-9e70-0e2bebe42c17 42 | userCondition: null 43 | handle: image 44 | hasTitleField: false 45 | icon: null 46 | name: Image 47 | showSlugField: true 48 | showStatusField: true 49 | slugTranslationKeyFormat: null 50 | slugTranslationMethod: site 51 | titleFormat: null 52 | titleTranslationKeyFormat: null 53 | titleTranslationMethod: site 54 | -------------------------------------------------------------------------------- /config/project/entryTypes/video--2456a57a-605c-4af0-9611-f48ca631ff0a.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | e426ad6b-03b0-4220-8668-3337284b7c5d: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | dateAdded: '2025-01-27T16:45:28+00:00' 10 | elementCondition: null 11 | fieldUid: 127f0d67-cfaf-4e5d-b3f8-111b7fda6f64 # Padding 12 | handle: null 13 | includeInCards: true 14 | instructions: null 15 | label: null 16 | providesThumbs: false 17 | required: false 18 | tip: null 19 | type: craft\fieldlayoutelements\CustomField 20 | uid: ac42c12f-111d-4cbb-883c-553898e51e5a 21 | userCondition: null 22 | warning: null 23 | width: 100 24 | - 25 | dateAdded: '2025-01-27T16:45:28+00:00' 26 | elementCondition: null 27 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 28 | handle: videoLink 29 | includeInCards: false 30 | instructions: 'YouTube or Vimeo' 31 | label: 'Video Link' 32 | providesThumbs: false 33 | required: false 34 | tip: null 35 | type: craft\fieldlayoutelements\CustomField 36 | uid: ffe24cd2-8cde-4218-aa2a-15b98218f829 37 | userCondition: null 38 | warning: null 39 | width: 100 40 | name: Content 41 | uid: 78216433-19bd-4871-aee8-1687783498cd 42 | userCondition: null 43 | handle: video 44 | hasTitleField: false 45 | icon: null 46 | name: Video 47 | showSlugField: true 48 | showStatusField: true 49 | slugTranslationKeyFormat: null 50 | slugTranslationMethod: site 51 | titleFormat: null 52 | titleTranslationKeyFormat: null 53 | titleTranslationMethod: site 54 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "createsean/craft-starter", 3 | "description": "A Craft CMS starter project by Sean Smith", 4 | "keywords": [ 5 | "craft", 6 | "cms", 7 | "craftcms", 8 | "project" 9 | ], 10 | "type": "project", 11 | "license": "MIT", 12 | "minimum-stability": "beta", 13 | "require": { 14 | "clubstudioltd/craft-asset-rev": "^8.0.0", 15 | "craftcms/ckeditor": "^4.0.3", 16 | "craftcms/cms": "^5.0.0", 17 | "craftcms/contact-form": "^3.1.0", 18 | "doublesecretagency/craft-cpcss": "^3.0.0", 19 | "mmikkel/retcon": "^3.0.0", 20 | "nystudio107/craft-minify": "^5.0.0-beta.2", 21 | "nystudio107/craft-seomatic": "^5.0.0-beta.8", 22 | "nystudio107/craft-typogrify": "^5.0.0-beta.2", 23 | "putyourlightson/craft-sprig": "^3.0.0-beta.2", 24 | "topshelfcraft/environment-label": "^5.0.0", 25 | "vardump/recentchanges": "^3.0.1", 26 | "verbb/hyper": "^2.0.0-beta.7", 27 | "verbb/knock-knock": "^3.0.0-beta.1", 28 | "vlucas/phpdotenv": "^5.4.0" 29 | }, 30 | "require-dev": { 31 | "yiisoft/yii2-shell": "^2.0.3" 32 | }, 33 | "autoload": { 34 | "psr-4": { 35 | "modules\\": "modules/", 36 | "modules\\sitemodule\\": "modules/sitemodule/src/" 37 | } 38 | }, 39 | "config": { 40 | "sort-packages": true, 41 | "optimize-autoloader": true, 42 | "platform": { 43 | "php": "8.2" 44 | }, 45 | "allow-plugins": { 46 | "craftcms/plugin-installer": true, 47 | "yiisoft/yii2-composer": true 48 | } 49 | }, 50 | "scripts": { 51 | "post-root-package-install": [ 52 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 53 | ], 54 | "post-create-project-cmd": [ 55 | "@php craft setup/security-key", 56 | "@php craft setup/app-id" 57 | ], 58 | "nuke": [ 59 | "rm -rf vendor/ && composer clear-cache && composer install" 60 | ] 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /config/project/entryTypes/codeEmbed--a983660a-2b2e-413f-a79c-498b502b4f85.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 5cffcd34-b35a-46b9-afa9-c3f3b295e13d: 4 | cardView: 5 | - 'layoutElement:0c4076ea-60fd-47cd-8995-455d0b2dbcd1' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T16:50:55+00:00' 12 | elementCondition: null 13 | fieldUid: 127f0d67-cfaf-4e5d-b3f8-111b7fda6f64 # Padding 14 | handle: null 15 | includeInCards: true 16 | instructions: null 17 | label: null 18 | providesThumbs: false 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: 0c4076ea-60fd-47cd-8995-455d0b2dbcd1 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2025-01-27T16:50:55+00:00' 28 | elementCondition: null 29 | fieldUid: 3b9496a7-4539-4c28-91bc-3e51c68f4187 # Embed 30 | handle: null 31 | includeInCards: false 32 | instructions: null 33 | label: Embed 34 | providesThumbs: false 35 | required: false 36 | tip: null 37 | type: craft\fieldlayoutelements\CustomField 38 | uid: e31f9ac5-7f1f-4429-9446-027fbdf0e6f3 39 | userCondition: null 40 | warning: null 41 | width: 100 42 | name: Content 43 | uid: 1107425a-00a9-49dc-81b2-989e058e0fee 44 | userCondition: null 45 | handle: codeEmbed 46 | hasTitleField: false 47 | icon: terminal 48 | name: 'Code Embed' 49 | showSlugField: true 50 | showStatusField: true 51 | slugTranslationKeyFormat: null 52 | slugTranslationMethod: site 53 | titleFormat: null 54 | titleTranslationKeyFormat: null 55 | titleTranslationMethod: site 56 | -------------------------------------------------------------------------------- /config/project/entryTypes/youtubeVideo--c4527788-b877-44f3-9a2d-071f696877fa.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 2be8891e-b97f-4d20-8c96-63ee3acef638: 4 | cardView: 5 | - 'layoutElement:344c64f5-781b-4fb5-a46b-4429b9f2f253' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T16:45:28+00:00' 12 | elementCondition: null 13 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 14 | handle: videoTitle 15 | includeInCards: true 16 | instructions: null 17 | label: 'Video Title' 18 | providesThumbs: false 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: 344c64f5-781b-4fb5-a46b-4429b9f2f253 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2025-01-27T16:45:28+00:00' 28 | elementCondition: null 29 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 30 | handle: videoId 31 | includeInCards: false 32 | instructions: 'i.e. LTRD2wUQ4KY' 33 | label: 'Video ID' 34 | providesThumbs: false 35 | required: false 36 | tip: null 37 | type: craft\fieldlayoutelements\CustomField 38 | uid: 0d461c76-9beb-40da-ae5e-a9d0fe2ded2d 39 | userCondition: null 40 | warning: null 41 | width: 100 42 | name: Content 43 | uid: 22553107-05a0-4b71-be18-0d3a3d8035b8 44 | userCondition: null 45 | handle: youtubeVideo 46 | hasTitleField: false 47 | icon: null 48 | name: 'YouTube Video (user guide)' 49 | showSlugField: true 50 | showStatusField: true 51 | slugTranslationKeyFormat: null 52 | slugTranslationMethod: site 53 | titleFormat: null 54 | titleTranslationKeyFormat: null 55 | titleTranslationMethod: site 56 | -------------------------------------------------------------------------------- /templates/_blocks/hero/standardHero.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 | 5 | {% set heroImage = block.image.one() %} 6 | 7 | 8 | {{ include('_includes/responsiveImage', { 9 | image: heroImage, 10 | transforms: [ 11 | { 12 | mq:'(max-width: 767.9px)', 13 | crop: { 14 | width: 767, 15 | height:300, 16 | mode: 'crop', 17 | quality: 80, 18 | } 19 | }, 20 | { 21 | mq:'(max-width: 1199px)', 22 | crop: { 23 | width: 1200, 24 | height:375, 25 | mode: 'crop', 26 | quality: 80, 27 | } 28 | }, 29 | { 30 | mq:'(min-width: 1200px)', 31 | crop: { 32 | width: 1920, 33 | height:450, 34 | mode: 'crop', 35 | quality: 80, 36 | } 37 | }, 38 | ], 39 | figureClass: null, 40 | figureStyle: null, 41 | pictureClass: null, 42 | caption: null, 43 | attributes: { 44 | alt: image.altText ?? image.title ?? null, 45 | class: 'object-cover z-0 w-full h-full lg:min-h-[450px] md:min-h-[375px] min-h-[300px]', 46 | loading: 'lazy', 47 | dataAttributes: '' 48 | }, 49 | }, with_context = false) }} 50 | 51 | 52 | {# hero content #} 53 |
54 |
55 |
56 |

{{ block.heroTitle ?? entry.title }}

57 | {% if block.copy|length %} 58 |
59 | {{ block.copy }} 60 |
61 | {% endif %} 62 | 63 | {{ block.button.getLink({ 64 | class: 'btn self-start', 65 | }) }} 66 | 67 |
68 |
69 |
70 | {# end hero content #} 71 |
-------------------------------------------------------------------------------- /templates/_includes/responsiveImage.twig: -------------------------------------------------------------------------------- 1 | {% set defaultCrop = transforms|last %} 2 | {% set defaultCrop = defaultCrop.crop %} 3 | 4 | {# set fallBack image for when the field is empty #} 5 | {% set fallbackImage = 'https://placehold.co/' ~ defaultCrop.width ~ 'x' ~ defaultCrop.height ~ '/dfe4f7/bababa' %} 6 | 7 | 8 |
9 | 10 | {% for transform in transforms %} 11 | {# jpeg source #} 12 | {% set crop = transform.crop %} 13 | 20 | {# webp source #} 21 | {% set cropWebp = transform.crop|merge({ 22 | 'format': 'webp' }) %} 23 | 30 | {% endfor %} 31 | 32 | {# 33 | use the final crop in the transforms array 34 | as the default 35 | #} 36 | {% set defaultCrop = transforms|last %} 37 | {% set defaultCrop = defaultCrop.crop %} 38 | {{ attributes.alt|striptags }} 47 | 48 | 49 | {# image caption #} 50 | {% if caption is defined and caption != null%} 51 |
52 | {{ caption }} 53 |
54 | {% endif %} 55 |
-------------------------------------------------------------------------------- /config/project/entryTypes/fragments--c166cd47-6f64-49e0-b33d-6aceadb3fcc3.yaml: -------------------------------------------------------------------------------- 1 | color: pink 2 | fieldLayouts: 3 | 27773fbe-4706-4cf6-aff2-7c6d13d64fe2: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | disabled: false 14 | elementCondition: null 15 | id: null 16 | includeInCards: false 17 | inputType: null 18 | instructions: null 19 | label: null 20 | max: null 21 | min: null 22 | name: null 23 | orientation: null 24 | placeholder: null 25 | providesThumbs: false 26 | readonly: false 27 | requirable: false 28 | size: null 29 | step: null 30 | tip: null 31 | title: null 32 | type: craft\fieldlayoutelements\entries\EntryTitleField 33 | uid: 15c4e0af-8e95-42fa-8015-e4b4a34c0c9e 34 | userCondition: null 35 | warning: null 36 | width: 100 37 | - 38 | elementCondition: null 39 | fieldUid: 77af5a62-d057-494a-91ac-9edf65b6b266 # Content Builder 40 | handle: null 41 | includeInCards: false 42 | instructions: null 43 | label: null 44 | providesThumbs: false 45 | required: false 46 | tip: null 47 | type: craft\fieldlayoutelements\CustomField 48 | uid: 4a5d1b5b-fdc1-4395-b5ec-88613d00ba33 49 | userCondition: null 50 | warning: null 51 | width: 100 52 | name: Content 53 | uid: 683d16fd-4d8f-4461-a6dd-15b7ece55232 54 | userCondition: null 55 | handle: fragments 56 | hasTitleField: true 57 | icon: puzzle-piece 58 | name: Fragments 59 | showSlugField: true 60 | showStatusField: true 61 | slugTranslationKeyFormat: '' 62 | slugTranslationMethod: site 63 | titleFormat: '' 64 | titleTranslationKeyFormat: '' 65 | titleTranslationMethod: site 66 | -------------------------------------------------------------------------------- /config/project/entryTypes/userGuide--475a351b-2442-4767-8ab6-1b39216d0c61.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | b0e00b72-8d9b-40b3-87a4-efcc1d0bc0ad: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | disabled: false 14 | elementCondition: null 15 | id: null 16 | includeInCards: false 17 | inputType: null 18 | instructions: null 19 | label: null 20 | max: null 21 | min: null 22 | name: null 23 | orientation: null 24 | placeholder: null 25 | providesThumbs: false 26 | readonly: false 27 | requirable: false 28 | size: null 29 | step: null 30 | tip: null 31 | title: null 32 | type: craft\fieldlayoutelements\entries\EntryTitleField 33 | uid: ef403fbe-a0cf-41c3-b22c-76881e7a4fac 34 | userCondition: null 35 | warning: null 36 | width: 100 37 | - 38 | elementCondition: null 39 | fieldUid: d974bf8d-647d-45f3-98be-0733d5e3e1ba # User Guide 40 | handle: null 41 | includeInCards: false 42 | instructions: null 43 | label: null 44 | providesThumbs: false 45 | required: false 46 | tip: null 47 | type: craft\fieldlayoutelements\CustomField 48 | uid: 7ff5a06e-1c8f-4594-830d-de5bbf507453 49 | userCondition: null 50 | warning: null 51 | width: 100 52 | name: Content 53 | uid: 89637c1a-bab7-4e46-9f03-aef99019b870 54 | userCondition: null 55 | handle: userGuide 56 | hasTitleField: true 57 | icon: person-chalkboard 58 | name: 'User Guide' 59 | showSlugField: true 60 | showStatusField: true 61 | slugTranslationKeyFormat: '' 62 | slugTranslationMethod: site 63 | titleFormat: '' 64 | titleTranslationKeyFormat: '' 65 | titleTranslationMethod: site 66 | -------------------------------------------------------------------------------- /config/project/entryTypes/error404--b312d78c-b490-46da-aeff-70a1be5a5505.yaml: -------------------------------------------------------------------------------- 1 | fieldLayouts: 2 | ff6710b6-fa56-44b7-a693-664ee41ba595: 3 | tabs: 4 | - 5 | elementCondition: null 6 | elements: 7 | - 8 | autocapitalize: true 9 | autocomplete: false 10 | autocorrect: true 11 | class: null 12 | dateAdded: '2025-01-27T12:01:38-05:00' 13 | disabled: false 14 | elementCondition: null 15 | id: null 16 | includeInCards: false 17 | inputType: null 18 | instructions: null 19 | label: null 20 | max: null 21 | min: null 22 | name: null 23 | orientation: null 24 | placeholder: null 25 | providesThumbs: false 26 | readonly: false 27 | required: true 28 | size: null 29 | step: null 30 | tip: null 31 | title: null 32 | type: craft\fieldlayoutelements\entries\EntryTitleField 33 | uid: d1826e4c-3c13-4edf-9d62-56e4d744a3dd 34 | userCondition: null 35 | warning: null 36 | width: 100 37 | - 38 | dateAdded: '2025-01-27T12:01:38-05:00' 39 | elementCondition: null 40 | fieldUid: da3d7ec4-1d85-47ba-a517-6c81d94cc9d2 # Copy Basic 41 | handle: text 42 | includeInCards: false 43 | instructions: null 44 | label: Text 45 | providesThumbs: false 46 | required: false 47 | tip: null 48 | type: craft\fieldlayoutelements\CustomField 49 | uid: b5b39377-f0b4-4435-99cb-6f3e7418b632 50 | userCondition: null 51 | warning: null 52 | width: 100 53 | name: Content 54 | uid: 1bdacb6a-18e5-4d7a-ad23-7b647073d35e 55 | userCondition: null 56 | handle: error404 57 | hasTitleField: true 58 | name: 'Error 404' 59 | showStatusField: true 60 | slugTranslationKeyFormat: null 61 | slugTranslationMethod: site 62 | sortOrder: 1 63 | titleFormat: null 64 | titleTranslationKeyFormat: null 65 | titleTranslationMethod: site 66 | -------------------------------------------------------------------------------- /config/project/entryTypes/sliderHero--323e9af3-aa75-4f1c-82eb-370e40179f41.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 532fe5e4-df32-4a3a-a746-e5f91f6e168b: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | dateAdded: '2024-10-23T17:27:03+00:00' 14 | disabled: false 15 | elementCondition: null 16 | id: null 17 | includeInCards: false 18 | inputType: null 19 | instructions: null 20 | label: null 21 | max: null 22 | min: null 23 | name: null 24 | orientation: null 25 | placeholder: null 26 | providesThumbs: false 27 | readonly: false 28 | requirable: false 29 | size: null 30 | step: null 31 | tip: null 32 | title: null 33 | type: craft\fieldlayoutelements\entries\EntryTitleField 34 | uid: 5e12737a-07df-4361-8f63-0eb9a62a8182 35 | userCondition: null 36 | warning: null 37 | width: 100 38 | - 39 | dateAdded: '2024-10-23T17:27:03+00:00' 40 | elementCondition: null 41 | fieldUid: 8c583e9a-a56d-486d-8550-e7eae61c8088 # Slides 42 | handle: null 43 | includeInCards: false 44 | instructions: null 45 | label: Slides 46 | providesThumbs: false 47 | required: false 48 | tip: null 49 | type: craft\fieldlayoutelements\CustomField 50 | uid: 61e062bf-9716-4fe4-892c-bc2dadb71721 51 | userCondition: null 52 | warning: null 53 | width: 100 54 | name: Content 55 | uid: e0366ccf-37de-4a01-9c00-95a40acd04f2 56 | userCondition: null 57 | handle: sliderHero 58 | hasTitleField: false 59 | icon: '' 60 | name: 'Slider Hero' 61 | showSlugField: true 62 | showStatusField: true 63 | slugTranslationKeyFormat: '' 64 | slugTranslationMethod: site 65 | titleFormat: '' 66 | titleTranslationKeyFormat: '' 67 | titleTranslationMethod: site 68 | -------------------------------------------------------------------------------- /templates/_user-guide/styles.twig: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.ddev/commands/host/launch-site: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash # Portable shebang - finds bash anywhere 2 | ## Description: Launch Craft CMS Control Panel and site homepage (reads CRAFT_CP_TRIGGER from .env) 3 | ## Usage: launch-site [path] 4 | ## Example: "ddev launch-site" or "ddev launch-site about" or "ddev launch-site styleguide" 5 | 6 | # Handle help flag 7 | if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then 8 | echo "Launch a browser with the Craft CMS Control Panel and site homepage" 9 | echo "" 10 | echo "Usage:" 11 | echo " ddev launch-site [path]" 12 | echo "" 13 | echo "Examples:" 14 | echo " \"ddev launch-site\" - Opens Control Panel and homepage" 15 | echo " \"ddev launch-site about\" - Opens Control Panel and /about" 16 | echo "" 17 | echo "The Control Panel URL is determined by the CRAFT_CP_TRIGGER value in your .env file" 18 | exit 0 19 | fi 20 | 21 | CP_TRIGGER="admin" 22 | 23 | if [ -f ".env" ]; then 24 | ENV_CP_TRIGGER=$(grep '^CRAFT_CP_TRIGGER=' .env | cut -d '=' -f2 | tr -d '"' | tr -d '"') 25 | if [ -n "$ENV_CP_TRIGGER" ]; then 26 | CP_TRIGGER="$ENV_CP_TRIGGER" 27 | fi 28 | fi 29 | 30 | # Get optional path argument 31 | CUSTOM_PATH="${1}" 32 | 33 | # Build URLs 34 | URL="https://${DDEV_HOSTNAME}/${CP_TRIGGER}" 35 | 36 | # Handle custom path if provided 37 | if [ -n "$CUSTOM_PATH" ]; then 38 | # Remove leading slash if present (we'll add it) 39 | CUSTOM_PATH="${CUSTOM_PATH#/}" 40 | HOME_URL="https://${DDEV_HOSTNAME}/${CUSTOM_PATH}" 41 | else 42 | HOME_URL="https://${DDEV_HOSTNAME}/" 43 | fi 44 | 45 | # Function to open URL in browser (cross-platform) 46 | open_browser() { 47 | local url="$1" 48 | if command -v start > /dev/null 2>&1; then 49 | # Windows (Git Bash, MSYS2, Cygwin) 50 | start "$url" 2>/dev/null || cmd.exe /c start "$url" 51 | elif command -v open > /dev/null 2>&1; then 52 | # macOS 53 | open "$url" 54 | elif command -v xdg-open > /dev/null 2>&1; then 55 | # Linux 56 | xdg-open "$url" 57 | else 58 | echo "Could not find browser launch command." 59 | echo "Please open your browser and navigate to: $url" 60 | return 1 61 | fi 62 | } 63 | 64 | echo "Launching Control Panel: $URL" 65 | open_browser "$URL" 66 | 67 | echo "Launching Homepage: $HOME_URL" 68 | open_browser "$HOME_URL" -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Craft-Starter", 3 | "version": "2.0.0", 4 | "description": "Craft Starter Website", 5 | "author": "Sean Smith, Caffeine Creations ", 6 | "copyright": "", 7 | "license": "UNLICENSED", 8 | "private": true, 9 | "devDependencies": { 10 | "@babel/preset-env": "^7.15.6", 11 | "@tailwindcss/aspect-ratio": "^0.4.2", 12 | "@tailwindcss/forms": "^0.5.3", 13 | "@tailwindcss/line-clamp": "^0.4.4", 14 | "@tailwindcss/typography": "^0.5.16", 15 | "cpy": "^11.1.0", 16 | "cpy-cli": "^5.0.0", 17 | "nodemon": "^3.0.2", 18 | "tailwindcss": "^4.0.7", 19 | "terser": "^5.39.0" 20 | }, 21 | "dependencies": { 22 | "@alpinejs/collapse": "^3.14.9", 23 | "@alpinejs/focus": "^3.14.9", 24 | "@alpinejs/intersect": "^3.14.9", 25 | "@alpinejs/persist": "^3.14.9", 26 | "@alpinejs/sort": "^3.14.9", 27 | "alpinejs": "^3.14.9", 28 | "browser-sync": "^3.0.3", 29 | "concat": "^1.0.3", 30 | "npm-run-all": "^4.1.5", 31 | "plyr": "^3.7.8", 32 | "swiper": "^11.2.4" 33 | }, 34 | "browserslist": [ 35 | "> .5% or last 2 versions" 36 | ], 37 | "scripts": { 38 | "copy": "npx cpy-cli ./node_modules/plyr/dist/plyr.min.js ./public/assets/js/ --flat", 39 | "concat:js": "concat ./node_modules/swiper/swiper-bundle.min.js ./node_modules/@alpinejs/persist/dist/cdn.min.js ./node_modules/@alpinejs/collapse/dist/cdn.min.js ./node_modules/@alpinejs/focus/dist/cdn.min.js ./node_modules/@alpinejs/intersect/dist/cdn.min.js ./node_modules/alpinejs/dist/cdn.min.js src/js/app.js > ./public/assets/js/app.js && npx terser ./public/assets/js/app.js -o ./public/assets/js/app.min.js", 40 | "concat:css": "concat ./node_modules/plyr/dist/plyr.css ./node_modules/swiper/swiper-bundle.min.css > ./public/assets/css/vendor.combined.css", 41 | "compile:css": "npx @tailwindcss/cli -i ./src/css/app.css -o ./public/assets/css/app.css --watch --minify", 42 | "watch:manifest": "nodemon --watch public/assets/js --watch public/assets/css -e js,css src/js/generate-manifest.js", 43 | "serve": "browser-sync start --config browsersync.config.js", 44 | "build": "npm-run-all copy concat:js concat:css \"watch:css -- --no-watch --minify\" && node src/js/generate-manifest.js", 45 | "start": "npm-run-all --parallel compile:css watch:manifest copy concat:js concat:css serve" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /config/general.php: -------------------------------------------------------------------------------- 1 | [ 19 | // Default Week Start Day (0 = Sunday, 1 = Monday...) 20 | 'defaultWeekStartDay' => 1, 21 | 22 | // Whether generated URLs should omit "index.php" 23 | 'omitScriptNameInUrls' => true, 24 | 25 | // Control Panel trigger word 26 | //'cpTrigger' => 'access', 27 | 28 | // The secure key Craft will use for hashing and encrypting data 29 | 'securityKey' => App::env('SECURITY_KEY'), 30 | 31 | 'disallowRobots' => true, 32 | // prevent /cpresources/ path showing up on the front end 33 | 'generateTransformsBeforePageLoad' => true, 34 | 35 | // Base site URL 36 | 'devMode' => false, 37 | 'allowAdminChanges' => true, 38 | 'addTrailingSlashesToUrls' => true, 39 | 'slugWordSeparator' => '-', 40 | 'privateTemplateTrigger' => "_", 41 | 'allowSimilarTags' => false, 42 | // 'disableDevmodeMinifying' => true, 43 | 'cacheDuration' => false, 44 | 'setPasswordPath' => 'setpassword', 45 | 'setPasswordSuccessPath' => 'login', 46 | // '@rootUrl' =>App::env('DEFAULT_SITE_URL'), 47 | // '@rootPath' =>App::env('SITE_PATH'), 48 | 49 | 'aliases' => array( 50 | 'environment' =>App::env('ENVIRONMENT'), 51 | 'basePath' =>App::env('SITE_PATH'), 52 | 'baseUrl' =>App::env('DEFAULT_SITE_URL'), 53 | ), 54 | ], 55 | 56 | // Dev environment settings 57 | 'dev' => [ 58 | // Dev Mode (see https://craftcms.com/guides/what-dev-mode-does) 59 | 'devMode' => true, 60 | 'allowAdminChanges' => true, 61 | ], 62 | 63 | // Staging environment settings 64 | 'staging' => [ 65 | 'devMode' => false, 66 | 'allowAdminChanges' => false, 67 | 68 | ], 69 | 70 | // Production environment settings 71 | 'production' => [ 72 | 'devMode' => false, 73 | 'allowAdminChanges' => false, 74 | 'disallowRobots' => false, 75 | ], 76 | ]; 77 | -------------------------------------------------------------------------------- /config/project/entryTypes/copy2--0187ae10-82fa-43e8-ac5c-e8fa4f2e3b29.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 623094d9-a7ca-4635-b4df-fb93c89d5b74: 4 | cardView: 5 | - 'layoutElement:ba979be8-7b6e-4cd0-a807-5019461b80ee' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T16:41:59+00:00' 12 | elementCondition: null 13 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 14 | handle: sectionTitle 15 | includeInCards: true 16 | instructions: null 17 | label: 'Section Title' 18 | providesThumbs: false 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: ba979be8-7b6e-4cd0-a807-5019461b80ee 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2025-01-27T16:41:59+00:00' 28 | elementCondition: null 29 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 30 | handle: sectionSubtitle 31 | includeInCards: false 32 | instructions: null 33 | label: 'Section Subtitle' 34 | providesThumbs: false 35 | required: false 36 | tip: null 37 | type: craft\fieldlayoutelements\CustomField 38 | uid: ff756a43-1935-4002-8b9e-845dc11eb17f 39 | userCondition: null 40 | warning: null 41 | width: 100 42 | - 43 | dateAdded: '2025-01-27T16:41:59+00:00' 44 | elementCondition: null 45 | fieldUid: f90a85bd-91b2-462b-acb4-8f265ded647e # Copy 46 | handle: null 47 | includeInCards: false 48 | instructions: null 49 | label: null 50 | providesThumbs: false 51 | required: false 52 | tip: null 53 | type: craft\fieldlayoutelements\CustomField 54 | uid: f2c4d154-8252-461f-bd0a-635b472473d1 55 | userCondition: null 56 | warning: null 57 | width: 100 58 | name: Content 59 | uid: e1a117ae-6930-4169-b0c6-525abba96b59 60 | userCondition: null 61 | handle: copy2 62 | hasTitleField: false 63 | icon: null 64 | name: 'Copy (user guide)' 65 | showSlugField: true 66 | showStatusField: true 67 | slugTranslationKeyFormat: null 68 | slugTranslationMethod: site 69 | titleFormat: null 70 | titleTranslationKeyFormat: null 71 | titleTranslationMethod: site 72 | -------------------------------------------------------------------------------- /config/project/entryTypes/video2--a399fb79-90a6-48a0-be1f-38d2b8a81af5.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | bc2a4d96-e189-4577-9559-d25bf551d2c1: 4 | cardView: 5 | - 'layoutElement:d05631c8-4a8b-4de3-8556-fdb8dac2c21f' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T16:41:59+00:00' 12 | elementCondition: null 13 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 14 | handle: sectionTitle 15 | includeInCards: true 16 | instructions: null 17 | label: 'Section Title' 18 | providesThumbs: false 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: d05631c8-4a8b-4de3-8556-fdb8dac2c21f 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2025-01-27T16:41:59+00:00' 28 | elementCondition: null 29 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 30 | handle: sectionsubtitle2 31 | includeInCards: false 32 | instructions: null 33 | label: SectionSubtitle 34 | providesThumbs: false 35 | required: false 36 | tip: null 37 | type: craft\fieldlayoutelements\CustomField 38 | uid: 9e2a1011-236a-4ff2-9867-acac7d531f6b 39 | userCondition: null 40 | warning: null 41 | width: 100 42 | - 43 | dateAdded: '2025-01-27T16:41:59+00:00' 44 | elementCondition: null 45 | fieldUid: 6f74be98-1b1b-470e-a96a-727b01e0b225 # Video Upload 46 | handle: null 47 | includeInCards: false 48 | instructions: null 49 | label: 'Video Upload' 50 | providesThumbs: true 51 | required: false 52 | tip: null 53 | type: craft\fieldlayoutelements\CustomField 54 | uid: 4f452736-a434-4ee7-b2d8-a1bd8f95e768 55 | userCondition: null 56 | warning: null 57 | width: 100 58 | name: Content 59 | uid: 56c54d1a-0bc9-493a-a342-789511c65600 60 | userCondition: null 61 | handle: video2 62 | hasTitleField: false 63 | icon: null 64 | name: 'Video (user guide)' 65 | showSlugField: true 66 | showStatusField: true 67 | slugTranslationKeyFormat: null 68 | slugTranslationMethod: site 69 | titleFormat: null 70 | titleTranslationKeyFormat: null 71 | titleTranslationMethod: site 72 | -------------------------------------------------------------------------------- /templates/_blocks/relatedEntries.twig: -------------------------------------------------------------------------------- 1 | {% extends '_blocks/_layout' %} 2 | 3 | {% block templateComment %} 4 | {{ craft.app.config.general.devMode ? ('') | raw }} 5 | {% endblock %} 6 | 7 | {# section background #} 8 | {% set background = '' %} 9 | 10 | {% block body %} 11 | 12 | {% if block.sectionTitle|length %} 13 |

{{ block.sectionTitle }}

14 | {% endif %} 15 | 16 |
17 | {% for entry in block.relatedEntries.collect() %} 18 |
19 | 20 | {% set image = entry.listingImage.one() %} 21 | {{ include('_includes/responsiveImage', { 22 | image: image, 23 | transforms: [ 24 | { 25 | mq:'(max-width: 767.9px)', 26 | crop: { 27 | width: 576, 28 | height:432, 29 | mode: 'crop', 30 | quality: 80, 31 | } 32 | }, 33 | { 34 | mq:'(min-width:768px) and (max-width: 1023.9px)', 35 | crop: { 36 | width: 232, 37 | height:174, 38 | mode: 'crop', 39 | quality: 80, 40 | } 41 | }, 42 | { 43 | mq:'(min-width:1024px) and (max-width: 1279.9px)', 44 | crop: { 45 | width: 310, 46 | height:232, 47 | mode: 'crop', 48 | quality: 80, 49 | } 50 | }, 51 | { 52 | mq:'(min-width: 1280px)', 53 | crop: { 54 | width: 480, 55 | height:360, 56 | mode: 'crop', 57 | quality: 80, 58 | } 59 | }, 60 | ], 61 | attributes: { 62 | alt: image.altText ?? image.title ?? null, 63 | class: '', 64 | loading: 'lazy', 65 | dataAttributes: '' 66 | }, 67 | }, with_context = false) }} 68 | 69 |
70 |

71 | {{ entry.title }} 72 |

73 | {% if entry.summary|length %} 74 |
75 | {{ entry.summary }} 76 |
77 | {% endif %} 78 | Learn More 79 |
80 |
81 | {% endfor %} 82 |
83 | 84 | {% endblock %} -------------------------------------------------------------------------------- /config/project/entryTypes/copy--70339fac-606b-4827-9a19-c97a3f0bd59c.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | f3caeaf8-c441-4ad3-a2e8-5ea9abdc3340: 4 | cardView: 5 | - 'layoutElement:eab65f53-ddcc-4fe7-86a6-125f0da1b7b0' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T16:37:44+00:00' 12 | elementCondition: null 13 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 14 | handle: sectionTitle 15 | includeInCards: false 16 | instructions: null 17 | label: 'Section Title' 18 | providesThumbs: false 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: 1bbe1188-9327-49e7-a774-9a8025b4a074 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2025-01-27T16:37:44+00:00' 28 | elementCondition: null 29 | fieldUid: f90a85bd-91b2-462b-acb4-8f265ded647e # Copy 30 | handle: null 31 | includeInCards: false 32 | instructions: null 33 | label: null 34 | providesThumbs: false 35 | required: false 36 | tip: null 37 | type: craft\fieldlayoutelements\CustomField 38 | uid: 7f199898-3c5d-4edc-bc9c-8140c1e08e8d 39 | userCondition: null 40 | warning: null 41 | width: 100 42 | name: Content 43 | uid: a7f94964-43d2-4526-914c-0aab192f6b93 44 | userCondition: null 45 | - 46 | elementCondition: null 47 | elements: 48 | - 49 | dateAdded: '2025-01-27T16:37:44+00:00' 50 | elementCondition: null 51 | fieldUid: 127f0d67-cfaf-4e5d-b3f8-111b7fda6f64 # Padding 52 | handle: null 53 | includeInCards: true 54 | instructions: null 55 | label: null 56 | providesThumbs: false 57 | required: false 58 | tip: null 59 | type: craft\fieldlayoutelements\CustomField 60 | uid: eab65f53-ddcc-4fe7-86a6-125f0da1b7b0 61 | userCondition: null 62 | warning: null 63 | width: 100 64 | name: Settings 65 | uid: a21a221d-a9f7-41b7-aa72-d995d0559cbd 66 | userCondition: null 67 | handle: copy 68 | hasTitleField: false 69 | icon: font-case 70 | name: Copy 71 | showSlugField: true 72 | showStatusField: true 73 | slugTranslationKeyFormat: null 74 | slugTranslationMethod: site 75 | titleFormat: null 76 | titleTranslationKeyFormat: null 77 | titleTranslationMethod: site 78 | -------------------------------------------------------------------------------- /templates/_tw-config/tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors": { 3 | "grayBrand": { 4 | "light": "#DADADA", 5 | "DEFAULT": "#373F41" 6 | }, 7 | "white": { 8 | "DEFAULT": "#FFFFFF" 9 | }, 10 | "black": { 11 | "DEFAULT": "#000000" 12 | }, 13 | "transparent": "transparent", 14 | "current": "currentColor", 15 | "green": { 16 | "50": "#f0fdf4", 17 | "100": "#dcfce7", 18 | "200": "#bbf7d0", 19 | "300": "#86efac", 20 | "400": "#4ade80", 21 | "500": "#22c55e", 22 | "600": "#16a34a", 23 | "700": "#15803d", 24 | "800": "#166534", 25 | "900": "#14532d" 26 | }, 27 | "pink": { 28 | "50": "#fdf2f8", 29 | "100": "#fce7f3", 30 | "200": "#fbcfe8", 31 | "300": "#f9a8d4", 32 | "400": "#f472b6", 33 | "500": "#ec4899", 34 | "600": "#db2777", 35 | "700": "#be185d", 36 | "800": "#9d174d", 37 | "900": "#831843" 38 | }, 39 | "red": { 40 | "50": "#fef2f2", 41 | "100": "#fee2e2", 42 | "200": "#fecaca", 43 | "300": "#fca5a5", 44 | "400": "#f87171", 45 | "500": "#ef4444", 46 | "600": "#dc2626", 47 | "700": "#b91c1c", 48 | "800": "#991b1b", 49 | "900": "#7f1d1d" 50 | }, 51 | "gray": { 52 | "50": "#f9fafb", 53 | "100": "#f3f4f6", 54 | "200": "#e5e7eb", 55 | "300": "#d1d5db", 56 | "400": "#9ca3af", 57 | "500": "#6b7280", 58 | "600": "#4b5563", 59 | "700": "#374151", 60 | "800": "#1f2937", 61 | "900": "#111827" 62 | } 63 | }, 64 | "fontFamily": { 65 | "sans": [ 66 | "ui-sans-serif", 67 | "system-ui", 68 | "-apple-system", 69 | "BlinkMacSystemFont", 70 | "\"Segoe UI\"", 71 | "Roboto", 72 | "\"Helvetica Neue\"", 73 | "Arial", 74 | "\"Noto Sans\"", 75 | "sans-serif", 76 | "\"Apple Color Emoji\"", 77 | "\"Segoe UI Emoji\"", 78 | "\"Segoe UI Symbol\"", 79 | "\"Noto Color Emoji\"" 80 | ], 81 | "serif": [ 82 | "ui-serif", 83 | "Georgia", 84 | "Cambria", 85 | "\"Times New Roman\"", 86 | "Times", 87 | "serif" 88 | ], 89 | "mono": [ 90 | "ui-monospace", 91 | "SFMono-Regular", 92 | "Menlo", 93 | "Monaco", 94 | "Consolas", 95 | "\"Liberation Mono\"", 96 | "\"Courier New\"", 97 | "monospace" 98 | ], 99 | "default": [ 100 | "HelveticaNeue-Light", 101 | "Helvetica Neue Light", 102 | "Helvetica Neue", 103 | "Helvetica", 104 | "Arial", 105 | "Lucida Grande", 106 | "sans-serif" 107 | ] 108 | } 109 | } -------------------------------------------------------------------------------- /templates/_components/pagination.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 | 5 | 72 | 73 |
-------------------------------------------------------------------------------- /config/project/volumes/uploads--70f5d47b-4830-4d51-95fe-bc0f7ccc0670.yaml: -------------------------------------------------------------------------------- 1 | fieldLayouts: 2 | b06de4af-a975-4b6c-8ef4-1c794da71432: 3 | tabs: 4 | - 5 | elementCondition: null 6 | elements: 7 | - 8 | autocapitalize: true 9 | autocomplete: false 10 | autocorrect: true 11 | class: null 12 | dateAdded: '2025-01-27T11:37:38-05:00' 13 | disabled: false 14 | elementCondition: null 15 | id: null 16 | includeInCards: false 17 | inputType: null 18 | instructions: null 19 | label: null 20 | max: null 21 | min: null 22 | name: null 23 | orientation: null 24 | placeholder: null 25 | providesThumbs: false 26 | readonly: false 27 | requirable: false 28 | size: null 29 | step: null 30 | tip: null 31 | title: null 32 | type: craft\fieldlayoutelements\assets\AssetTitleField 33 | uid: c2cfa525-cf76-4f98-a9aa-5c1053b45a5c 34 | userCondition: null 35 | warning: null 36 | width: 100 37 | - 38 | dateAdded: '2025-01-27T11:37:38-05:00' 39 | elementCondition: null 40 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 41 | handle: altText 42 | includeInCards: false 43 | instructions: null 44 | label: 'Alt Text' 45 | providesThumbs: false 46 | required: false 47 | tip: null 48 | type: craft\fieldlayoutelements\CustomField 49 | uid: 294cd7dd-e705-4c7e-8730-ef3c8e6ef66f 50 | userCondition: null 51 | warning: null 52 | width: 100 53 | - 54 | dateAdded: '2025-01-27T11:37:38-05:00' 55 | elementCondition: null 56 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 57 | handle: caption 58 | includeInCards: false 59 | instructions: null 60 | label: Caption 61 | providesThumbs: false 62 | required: false 63 | tip: null 64 | type: craft\fieldlayoutelements\CustomField 65 | uid: 8f87d31c-0e72-4d32-a0ea-c95a5c987e2f 66 | userCondition: null 67 | warning: null 68 | width: 100 69 | name: Content 70 | uid: 454bf547-c45d-41e0-9375-29df94751d21 71 | userCondition: null 72 | fs: uploads 73 | handle: uploads 74 | name: Uploads 75 | sortOrder: 1 76 | titleTranslationKeyFormat: null 77 | titleTranslationMethod: site 78 | transformFs: null 79 | transformSubpath: '' 80 | -------------------------------------------------------------------------------- /templates/_includes/news-listing-article.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
9 | 10 | 11 | 12 | {% set image = entry.image.one() ?? fallback.fallbackImage.one() %} 13 | {{ include('_includes/responsiveImage', { 14 | image: image, 15 | transforms: [ 16 | { 17 | mq:'(max-width: 767.9px)', 18 | crop: { 19 | width: 734, 20 | height:367, 21 | mode: 'crop', 22 | quality: 80, 23 | } 24 | }, 25 | { 26 | mq:'(min-width:768px) and (max-width: 1024px)', 27 | crop: { 28 | width:734, 29 | height:367, 30 | mode: 'crop', 31 | quality: 80, 32 | } 33 | }, 34 | { 35 | mq:'(min-width:1025px) and (max-width: 1280px)', 36 | crop: { 37 | width:480, 38 | height:240, 39 | mode: 'crop', 40 | quality: 80, 41 | } 42 | }, 43 | { 44 | mq:'(min-width: 1200px)', 45 | crop: { 46 | width:734, 47 | height:367, 48 | mode: 'crop', 49 | quality: 80, 50 | } 51 | }, 52 | ], 53 | figureClass: null, 54 | figureStyle: null, 55 | pictureClass: null, 56 | caption:null, 57 | attributes: { 58 | alt: image.altText ?? image.title ?? null, 59 | class: '', 60 | loading: 'lazy', 61 | dataAttributes: '' 62 | }, 63 | }, with_context = false) }} 64 | 65 | 66 |
67 |
68 |

69 | {{ entry.postDate|date('F jS, Y') }} 70 |

71 | 72 | {% for category in entry.newsCategories.limit('3').all() %} 73 | {{ not loop.last ? ', ' }} 74 | {% endfor %} 75 | 76 |
77 |

78 | 79 | {{ entry.title }} 80 | 81 |

82 | 83 |
84 | {{ entry.summary }} 85 |
86 |
87 |
-------------------------------------------------------------------------------- /config/project/entryTypes/standardHero--120a7750-0967-496d-9315-bba6d83eb4b1.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 73281f26-73de-4318-a067-3d6c6905b1cd: 4 | cardView: 5 | - 'layoutElement:360e355c-d9f2-417d-af9f-ce89b15c6e4a' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2025-01-27T16:37:38+00:00' 12 | elementCondition: null 13 | fieldUid: 7bf7da79-8f7d-4a1b-8129-121b24c0d99b # Hero Image 14 | handle: image 15 | includeInCards: false 16 | instructions: null 17 | label: Image 18 | providesThumbs: true 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: 98f0e07e-81da-484f-8190-987af0f739c8 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2025-01-27T16:37:38+00:00' 28 | elementCondition: null 29 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 30 | handle: heroTitle 31 | includeInCards: true 32 | instructions: 'If empty page title will be used' 33 | label: 'Hero Title' 34 | providesThumbs: false 35 | required: false 36 | tip: null 37 | type: craft\fieldlayoutelements\CustomField 38 | uid: 360e355c-d9f2-417d-af9f-ce89b15c6e4a 39 | userCondition: null 40 | warning: null 41 | width: 100 42 | - 43 | dateAdded: '2025-01-27T16:37:38+00:00' 44 | elementCondition: null 45 | fieldUid: da3d7ec4-1d85-47ba-a517-6c81d94cc9d2 # Copy Basic 46 | handle: copy 47 | includeInCards: false 48 | instructions: null 49 | label: Copy 50 | providesThumbs: false 51 | required: false 52 | tip: null 53 | type: craft\fieldlayoutelements\CustomField 54 | uid: b95dfd47-bd17-4d2d-b2f5-586a0750667f 55 | userCondition: null 56 | warning: null 57 | width: 100 58 | - 59 | dateAdded: '2025-01-27T16:37:38+00:00' 60 | elementCondition: null 61 | fieldUid: 136d3c61-5e7c-4eb4-afc0-5c78565fbe8b # Button 62 | handle: null 63 | includeInCards: false 64 | instructions: null 65 | label: null 66 | providesThumbs: false 67 | required: false 68 | tip: null 69 | type: craft\fieldlayoutelements\CustomField 70 | uid: 8f7852fc-9a4e-40a7-9816-dbb286775bf9 71 | userCondition: null 72 | warning: null 73 | width: 100 74 | name: Content 75 | uid: 4f2e4fad-7ce3-4757-abbd-6483c2dc8abe 76 | userCondition: null 77 | handle: standardHero 78 | hasTitleField: false 79 | icon: null 80 | name: 'Standard Hero' 81 | showSlugField: true 82 | showStatusField: true 83 | slugTranslationKeyFormat: null 84 | slugTranslationMethod: site 85 | titleFormat: null 86 | titleTranslationKeyFormat: null 87 | titleTranslationMethod: site 88 | -------------------------------------------------------------------------------- /config/project/entryTypes/slide--d399ecfb-7ec8-47d8-84ed-b8447e779a67.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | description: null 3 | fieldLayouts: 4 | cd7a8b0c-f1dc-4657-98cc-8b2e9c46c04f: 5 | cardThumbAlignment: end 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2024-10-23T17:31:19+00:00' 12 | editCondition: null 13 | elementCondition: null 14 | fieldUid: b2f53aa5-81a3-466c-af2d-e30dab4ed3d8 # Image 15 | handle: image 16 | includeInCards: false 17 | instructions: '1900px * 450px' 18 | label: 'Slide Background Image' 19 | providesThumbs: true 20 | required: false 21 | tip: null 22 | type: craft\fieldlayoutelements\CustomField 23 | uid: 089152b0-0d41-4e63-92a8-d83178a4ce67 24 | userCondition: null 25 | warning: null 26 | width: 100 27 | - 28 | dateAdded: '2024-10-23T17:31:19+00:00' 29 | editCondition: null 30 | elementCondition: null 31 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 32 | handle: slideTitle 33 | includeInCards: false 34 | instructions: null 35 | label: 'Slide Title' 36 | providesThumbs: false 37 | required: true 38 | tip: null 39 | type: craft\fieldlayoutelements\CustomField 40 | uid: a4a388a4-1eb3-4e3a-8781-e0887b77d13e 41 | userCondition: null 42 | warning: null 43 | width: 100 44 | - 45 | dateAdded: '2024-10-23T17:31:19+00:00' 46 | editCondition: null 47 | elementCondition: null 48 | fieldUid: f90a85bd-91b2-462b-acb4-8f265ded647e # Copy 49 | handle: null 50 | includeInCards: false 51 | instructions: null 52 | label: null 53 | providesThumbs: false 54 | required: false 55 | tip: null 56 | type: craft\fieldlayoutelements\CustomField 57 | uid: 9dc85697-b157-4152-bec7-c66e23453a25 58 | userCondition: null 59 | warning: null 60 | width: 100 61 | - 62 | dateAdded: '2024-10-23T17:31:19+00:00' 63 | editCondition: null 64 | elementCondition: null 65 | fieldUid: 136d3c61-5e7c-4eb4-afc0-5c78565fbe8b # Button 66 | handle: null 67 | includeInCards: false 68 | instructions: null 69 | label: null 70 | providesThumbs: false 71 | required: false 72 | tip: null 73 | type: craft\fieldlayoutelements\CustomField 74 | uid: 0597412a-b607-46e5-a657-aeced9b4a521 75 | userCondition: null 76 | warning: null 77 | width: 100 78 | name: Content 79 | uid: 50edff63-4472-47a0-b1de-b7d952adb095 80 | userCondition: null 81 | handle: slide 82 | hasTitleField: false 83 | icon: gallery-thumbnails 84 | name: Slide 85 | showSlugField: false 86 | showStatusField: false 87 | slugTranslationKeyFormat: null 88 | slugTranslationMethod: site 89 | titleFormat: '{slideTitle}' 90 | titleTranslationKeyFormat: null 91 | titleTranslationMethod: site 92 | -------------------------------------------------------------------------------- /templates/_includes/contact-form.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 |
5 |
6 | 7 | {% macro errorList(errors) %} 8 | {% if errors %} 9 | {{ ul(errors, {class: 'errors'}) }} 10 | {% endif %} 11 | {% endmacro %} 12 | 13 | {% set message = message ?? null %} 14 | 15 | {# The `success` variable is defined by the contact form controller on success #} 16 | {% if success is defined and success %} 17 | 18 |

{{ fromName }}, Your message was successfully sent!

19 | 20 | {% else %} 21 |

22 | no success 23 |

24 | {% endif %} 25 | 26 | 27 |
32 | {{ csrfInput() }} 33 | {{ actionInput('contact-form/send') }} 34 | {# {{ redirectInput('contact/thanks') }} #} 35 | 36 | 37 |

Contact Us

38 | 39 |
40 | {{ input('text', 'fromName', message.fromName ?? '', { 41 | id: 'from-name', 42 | autocomplete: 'name', 43 | class: 'floating-input w-full', 44 | 'aria-label': "Your Name"|t, 45 | placeholder: "Your Name"|t, 46 | 47 | }) }} 48 | 49 | {{ message ? _self.errorList(message.getErrors('fromName')) }} 50 |
51 | 52 |
53 | {{ input('email', 'fromEmail', message.fromEmail ?? '', { 54 | id: 'from-email', 55 | autocomplete: 'email', 56 | class: 'floating-input w-full', 57 | 'aria-label': "Email"|t, 58 | placeholder: "Email"|t, 59 | }) }} 60 | 61 | {{ message ? _self.errorList(message.getErrors('fromEmail')) }} 62 |
63 | 64 |
65 | {{ input('text', 'subject', message.subject ?? '', { 66 | id: 'subject', 67 | class: 'floating-input w-full', 68 | 'aria-label': "Submect"|t, 69 | placeholder: "Subject"|t, 70 | }) }} 71 | 72 | {{ message ? _self.errorList(message.getErrors('subject')) }} 73 |
74 | 75 |
76 | {{ tag('textarea', { 77 | text: message.message ?? '', 78 | id: 'message', 79 | name: 'message', 80 | rows: 10, 81 | cols: 40, 82 | class: 'floating-input w-full', 83 | 'aria-label': "Message"|t, 84 | placeholder: "Message"|t, 85 | }) }} 86 | 87 | {{ message ? _self.errorList(message.getErrors('message')) }} 88 |
89 | 90 | 91 |
92 | 93 |
94 |
95 |
-------------------------------------------------------------------------------- /config/project/entryTypes/relatedEntries--c951c9a0-1cca-4210-bef8-2d3d0446e841.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 5dd65675-497a-4ca9-b807-7e443b915ef5: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | dateAdded: '2025-01-27T16:37:49+00:00' 14 | disabled: false 15 | elementCondition: null 16 | id: null 17 | includeInCards: false 18 | inputType: null 19 | instructions: null 20 | label: null 21 | max: null 22 | min: null 23 | name: null 24 | orientation: null 25 | placeholder: null 26 | providesThumbs: false 27 | readonly: false 28 | required: true 29 | size: null 30 | step: null 31 | tip: null 32 | title: null 33 | type: craft\fieldlayoutelements\entries\EntryTitleField 34 | uid: 13a4007c-1fdb-4747-bb47-e83ca4ca29a7 35 | userCondition: null 36 | warning: null 37 | width: 100 38 | - 39 | dateAdded: '2025-01-27T16:37:49+00:00' 40 | elementCondition: null 41 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 42 | handle: sectionTitle 43 | includeInCards: false 44 | instructions: null 45 | label: 'Section Title' 46 | providesThumbs: false 47 | required: false 48 | tip: null 49 | type: craft\fieldlayoutelements\CustomField 50 | uid: 52b9bea1-445b-41fa-ac5f-b334fc72f044 51 | userCondition: null 52 | warning: null 53 | width: 100 54 | - 55 | dateAdded: '2025-01-27T16:37:49+00:00' 56 | elementCondition: null 57 | fieldUid: 5026b221-a48f-4868-9f48-07428068e77e # Related Entries 58 | handle: null 59 | includeInCards: false 60 | instructions: null 61 | label: 'Related Entries' 62 | providesThumbs: false 63 | required: false 64 | tip: null 65 | type: craft\fieldlayoutelements\CustomField 66 | uid: 23c2f709-04c7-4f0f-926d-c0f2e04b3fc7 67 | userCondition: null 68 | warning: null 69 | width: 100 70 | name: Content 71 | uid: 6f27ce87-60b4-40a1-8b87-dea3e269f9a5 72 | userCondition: null 73 | - 74 | elementCondition: null 75 | elements: 76 | - 77 | dateAdded: '2025-01-27T16:37:49+00:00' 78 | elementCondition: null 79 | fieldUid: 127f0d67-cfaf-4e5d-b3f8-111b7fda6f64 # Padding 80 | handle: null 81 | includeInCards: false 82 | instructions: null 83 | label: null 84 | providesThumbs: false 85 | required: false 86 | tip: null 87 | type: craft\fieldlayoutelements\CustomField 88 | uid: a5fecab2-6bd5-43f3-9ae5-597561792f6f 89 | userCondition: null 90 | warning: null 91 | width: 100 92 | name: Settings 93 | uid: 38096454-3d05-4faf-a7c4-290e1628e1de 94 | userCondition: null 95 | handle: relatedEntries 96 | hasTitleField: false 97 | icon: '' 98 | name: 'Related Entries' 99 | showSlugField: true 100 | showStatusField: true 101 | slugTranslationKeyFormat: '' 102 | slugTranslationMethod: site 103 | titleFormat: '' 104 | titleTranslationKeyFormat: '' 105 | titleTranslationMethod: site 106 | -------------------------------------------------------------------------------- /config/project/entryTypes/home--ea7fe716-adee-4200-a8ca-15362418cd97.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 69a2a893-3c54-4b63-80c3-7a42ccd38392: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | dateAdded: '2024-10-23T17:26:50+00:00' 14 | disabled: false 15 | elementCondition: null 16 | id: null 17 | includeInCards: false 18 | inputType: null 19 | instructions: null 20 | label: null 21 | max: null 22 | min: null 23 | name: null 24 | orientation: null 25 | placeholder: null 26 | providesThumbs: false 27 | readonly: false 28 | requirable: false 29 | size: null 30 | step: null 31 | tip: null 32 | title: null 33 | type: craft\fieldlayoutelements\entries\EntryTitleField 34 | uid: 467696f6-b326-4dda-833f-6cf5ffc6d2ed 35 | userCondition: null 36 | warning: null 37 | width: 100 38 | - 39 | dateAdded: '2024-10-23T17:26:50+00:00' 40 | elementCondition: null 41 | fieldUid: ab8abc7e-2a4d-4858-98ea-9a6954a434da # Hero 42 | handle: null 43 | includeInCards: false 44 | instructions: null 45 | label: null 46 | providesThumbs: false 47 | required: false 48 | tip: null 49 | type: craft\fieldlayoutelements\CustomField 50 | uid: 25693e05-7ef0-4518-9fc5-2e899504f485 51 | userCondition: null 52 | warning: null 53 | width: 100 54 | - 55 | dateAdded: '2024-10-23T17:26:50+00:00' 56 | elementCondition: null 57 | heading: 'Main Content' 58 | type: craft\fieldlayoutelements\Heading 59 | uid: c8c8df54-5786-47de-80fc-a00ce2555844 60 | userCondition: null 61 | - 62 | dateAdded: '2024-10-23T17:26:50+00:00' 63 | elementCondition: null 64 | fieldUid: 77af5a62-d057-494a-91ac-9edf65b6b266 # Content Builder 65 | handle: null 66 | includeInCards: false 67 | instructions: null 68 | label: null 69 | providesThumbs: false 70 | required: false 71 | tip: null 72 | type: craft\fieldlayoutelements\CustomField 73 | uid: 53da33c9-cd95-43ca-98d3-b1ed3ec87096 74 | userCondition: null 75 | warning: null 76 | width: 100 77 | name: Content 78 | uid: 9768a398-72b1-4c65-aa91-dcad9be74a1f 79 | userCondition: null 80 | - 81 | elementCondition: null 82 | elements: 83 | - 84 | dateAdded: '2024-10-23T17:26:50+00:00' 85 | elementCondition: null 86 | fieldUid: 149ec41c-d6de-4ae5-84db-08d285801dd1 # SEO 87 | handle: null 88 | includeInCards: false 89 | instructions: null 90 | label: null 91 | providesThumbs: false 92 | required: false 93 | tip: null 94 | type: craft\fieldlayoutelements\CustomField 95 | uid: cd01d059-99d4-4f31-a7be-e7ee6686623a 96 | userCondition: null 97 | warning: null 98 | width: 100 99 | name: SEO 100 | uid: b1392c98-ec7a-4fd0-a163-1e2db652424d 101 | userCondition: null 102 | handle: home 103 | hasTitleField: true 104 | icon: house 105 | name: Home 106 | showSlugField: true 107 | showStatusField: true 108 | slugTranslationKeyFormat: '' 109 | slugTranslationMethod: site 110 | titleFormat: '{' 111 | titleTranslationKeyFormat: '' 112 | titleTranslationMethod: site 113 | -------------------------------------------------------------------------------- /config/project/entryTypes/callToAction--57a74cde-de83-4b69-88ff-a4472daac7f7.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 7d8c40f9-257c-41b4-8747-551f180cacc5: 4 | cardView: 5 | - 'layoutElement:1b392e2e-ab1b-42ce-81a1-01fbd59e5ce6' 6 | tabs: 7 | - 8 | elementCondition: null 9 | elements: 10 | - 11 | dateAdded: '2024-08-10T13:55:01+00:00' 12 | elementCondition: null 13 | fieldUid: c161a9a5-2cf6-4cc3-b0d8-3c8a30395dde # Input 14 | handle: sectionTitle 15 | includeInCards: false 16 | instructions: null 17 | label: 'Section Title' 18 | providesThumbs: false 19 | required: false 20 | tip: null 21 | type: craft\fieldlayoutelements\CustomField 22 | uid: a71662d0-b947-40fe-9aee-693197d4445b 23 | userCondition: null 24 | warning: null 25 | width: 100 26 | - 27 | dateAdded: '2024-08-10T14:14:10+00:00' 28 | elementCondition: null 29 | heading: Button 30 | type: craft\fieldlayoutelements\Heading 31 | uid: 4d3c66b5-b450-43b5-9c31-784ca651934b 32 | userCondition: null 33 | - 34 | dateAdded: '2024-08-10T13:55:01+00:00' 35 | elementCondition: null 36 | fieldUid: 136d3c61-5e7c-4eb4-afc0-5c78565fbe8b # Button 37 | handle: null 38 | includeInCards: false 39 | instructions: null 40 | label: null 41 | providesThumbs: false 42 | required: false 43 | tip: null 44 | type: craft\fieldlayoutelements\CustomField 45 | uid: bdb7e4c4-caa6-40d1-bb93-831a931266f2 46 | userCondition: null 47 | warning: null 48 | width: 100 49 | - 50 | dateAdded: '2024-08-10T13:57:26+00:00' 51 | elementCondition: null 52 | type: craft\fieldlayoutelements\HorizontalRule 53 | uid: c9c6d83f-3770-4b0a-8802-e2a8d180b708 54 | userCondition: null 55 | - 56 | dateAdded: '2024-08-10T13:55:01+00:00' 57 | elementCondition: null 58 | fieldUid: cc618569-5c0e-4ff7-9b4a-2fe9ed27af1f # Background Image 59 | handle: null 60 | includeInCards: false 61 | instructions: null 62 | label: 'Background Image' 63 | providesThumbs: true 64 | required: false 65 | tip: null 66 | type: craft\fieldlayoutelements\CustomField 67 | uid: 4c36cc61-1f7c-4373-91f1-16aa37ce2c5b 68 | userCondition: null 69 | warning: null 70 | width: 100 71 | name: Content 72 | uid: d76b4b4a-101d-4508-8153-84c7205cd9a3 73 | userCondition: null 74 | - 75 | elementCondition: null 76 | elements: 77 | - 78 | dateAdded: '2024-08-10T13:55:01+00:00' 79 | elementCondition: null 80 | fieldUid: 127f0d67-cfaf-4e5d-b3f8-111b7fda6f64 # Padding 81 | handle: null 82 | includeInCards: true 83 | instructions: null 84 | label: Padding 85 | providesThumbs: false 86 | required: false 87 | tip: null 88 | type: craft\fieldlayoutelements\CustomField 89 | uid: 1b392e2e-ab1b-42ce-81a1-01fbd59e5ce6 90 | userCondition: null 91 | warning: null 92 | width: 100 93 | name: Options 94 | uid: 20860368-2cde-47b2-8a45-468b6f3b4fc0 95 | userCondition: null 96 | handle: callToAction 97 | hasTitleField: false 98 | icon: link 99 | name: 'Call To Action' 100 | showSlugField: true 101 | showStatusField: true 102 | slugTranslationKeyFormat: null 103 | slugTranslationMethod: site 104 | titleFormat: null 105 | titleTranslationKeyFormat: null 106 | titleTranslationMethod: site 107 | -------------------------------------------------------------------------------- /config/project/entryTypes/noticeBar--5bca37e0-a30f-48fd-9fde-3105fb9d9738.yaml: -------------------------------------------------------------------------------- 1 | fieldLayouts: 2 | 051e5080-5716-48d1-8d3d-69b3d850a9ca: 3 | tabs: 4 | - 5 | elementCondition: null 6 | elements: 7 | - 8 | autocapitalize: true 9 | autocomplete: false 10 | autocorrect: true 11 | class: null 12 | dateAdded: '2025-01-27T12:01:38-05:00' 13 | disabled: false 14 | elementCondition: null 15 | id: null 16 | includeInCards: false 17 | inputType: null 18 | instructions: null 19 | label: null 20 | max: null 21 | min: null 22 | name: null 23 | orientation: null 24 | placeholder: null 25 | providesThumbs: false 26 | readonly: false 27 | required: true 28 | size: null 29 | step: null 30 | tip: null 31 | title: null 32 | type: craft\fieldlayoutelements\entries\EntryTitleField 33 | uid: a112464c-3177-4fb9-9327-e01f6f402c5e 34 | userCondition: null 35 | warning: null 36 | width: 100 37 | - 38 | dateAdded: '2025-01-27T12:01:38-05:00' 39 | elementCondition: null 40 | fieldUid: 5489ed3b-28c1-4a26-ac7e-97b0182e6652 # Enable Notice Bar 41 | handle: null 42 | includeInCards: false 43 | instructions: null 44 | label: null 45 | providesThumbs: false 46 | required: false 47 | tip: null 48 | type: craft\fieldlayoutelements\CustomField 49 | uid: 6a3a9669-fd06-48a0-9c6c-7d57a8673df6 50 | userCondition: null 51 | warning: null 52 | width: 50 53 | - 54 | dateAdded: '2025-01-27T12:01:38-05:00' 55 | elementCondition: null 56 | fieldUid: 52f12f1b-ba11-48f3-985d-0ee6e2a6dc4e # Notice Bar Location 57 | handle: null 58 | includeInCards: false 59 | instructions: null 60 | label: null 61 | providesThumbs: false 62 | required: false 63 | tip: null 64 | type: craft\fieldlayoutelements\CustomField 65 | uid: 73f65df1-43ec-4557-8579-cb72ea2554fc 66 | userCondition: null 67 | warning: null 68 | width: 50 69 | - 70 | dateAdded: '2025-01-27T12:01:38-05:00' 71 | elementCondition: null 72 | fieldUid: 136d3c61-5e7c-4eb4-afc0-5c78565fbe8b # Button 73 | handle: null 74 | includeInCards: false 75 | instructions: null 76 | label: null 77 | providesThumbs: false 78 | required: false 79 | tip: null 80 | type: craft\fieldlayoutelements\CustomField 81 | uid: af7d8040-e45a-4132-86a1-9020152c0d10 82 | userCondition: null 83 | warning: null 84 | width: 75 85 | - 86 | dateAdded: '2025-01-27T12:01:38-05:00' 87 | elementCondition: null 88 | fieldUid: da3d7ec4-1d85-47ba-a517-6c81d94cc9d2 # Copy Basic 89 | handle: text 90 | includeInCards: false 91 | instructions: null 92 | label: Text 93 | providesThumbs: false 94 | required: false 95 | tip: null 96 | type: craft\fieldlayoutelements\CustomField 97 | uid: 1af21084-1c75-4add-af7b-4d5443ae4120 98 | userCondition: null 99 | warning: null 100 | width: 100 101 | name: Content 102 | uid: 4678e52f-c995-4149-922a-e84c2d8eb686 103 | userCondition: null 104 | handle: noticeBar 105 | hasTitleField: false 106 | name: 'Notice Bar' 107 | showStatusField: true 108 | slugTranslationKeyFormat: null 109 | slugTranslationMethod: site 110 | sortOrder: 1 111 | titleFormat: '{section.name|raw}' 112 | titleTranslationKeyFormat: null 113 | titleTranslationMethod: site 114 | -------------------------------------------------------------------------------- /templates/_blocks/hero/sliderHero.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 | 5 |
6 | {% for slide in block.slides.all() %} 7 | 8 |
9 | 10 | {# image #} 11 |
12 | {% set heroImage = slide.image.one() %} 13 | {{ include('_includes/responsiveImage', { 14 | image: heroImage, 15 | transforms: [ 16 | { 17 | mq:'(max-width: 767.9px)', 18 | crop: { 19 | width: 767, 20 | height:300, 21 | mode: 'crop', 22 | quality: 80, 23 | } 24 | }, 25 | { 26 | mq:'(max-width: 1199px)', 27 | crop: { 28 | width: 1200, 29 | height:375, 30 | mode: 'crop', 31 | quality: 80, 32 | } 33 | }, 34 | { 35 | mq:'(min-width: 1200px)', 36 | crop: { 37 | width: 1920, 38 | height:450, 39 | mode: 'crop', 40 | quality: 80, 41 | } 42 | }, 43 | ], 44 | attributes: { 45 | alt: image.altText ?? image.title ?? null, 46 | class: 'object-cover z-0 mx-auto', 47 | loading: 'lazy', 48 | dataAttributes: '' 49 | }, 50 | }, with_context = false) }} 51 | 52 | {# slide copy #} 53 |
54 |
55 |
56 | {% if slide.slideTitle|length %} 57 |

{{ slide.slideTitle }}

58 | {% endif %} 59 | {% if slide.copy|length %} 60 |
61 | {{ slide.copy }} 62 |
63 | {% endif %} 64 | 65 | {{ slide.button.getLink({ 66 | class: 'btn self-start', 67 | }) }} 68 | 69 |
70 |
71 |
72 | {# end slide copy #} 73 | 74 |
75 | 76 | 77 |
78 | 79 | {% endfor %} 80 | 81 |
82 | 83 |
84 |
85 | {#
#} 86 |
87 | 88 | {# prev #} 89 |
{{ svg('@webroot/assets/images/svg/arrow-right-white.svg')|attr({class:'w-10 h-10 inline-block rotate-180' }) }}
90 | 91 | {# next #} 92 |
{{ svg('@webroot/assets/images/svg/arrow-right-white.svg')|attr({class:'w-10 h-10 inline-block' }) }}
93 | 94 |
95 |
96 |
97 |
98 | 99 | 100 | {% css %} 101 | {# .swiper-button-prev, .swiper-button-next { 102 | width:2.5rem; 103 | } 104 | .swiper-button-next:after { 105 | display:none; 106 | } 107 | .swiper-button-prev:after { 108 | display:none; 109 | } #} 110 | {% endcss %} 111 | 112 | 113 | {# javascript #} 114 | {% js %} 115 | {% include "_javascript/hero-swiper.js" %} 116 | {% endjs %} 117 | 118 | 119 | 120 | 121 | 122 | {#
123 | 124 |
125 |
126 |
127 |

{{ block.heroTitle ?? entry.title }}

128 |
129 |
130 |
131 | 132 |
#} -------------------------------------------------------------------------------- /config/project/entryTypes/newsListing--e3dea9df-426f-43a5-96fd-927882533aa9.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | 8f880d21-2d24-4e77-b149-cd95cb26961c: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | dateAdded: '2025-01-27T11:58:14-05:00' 14 | disabled: false 15 | elementCondition: null 16 | id: null 17 | includeInCards: false 18 | inputType: null 19 | instructions: null 20 | label: null 21 | max: null 22 | min: null 23 | name: null 24 | orientation: null 25 | placeholder: null 26 | providesThumbs: false 27 | readonly: false 28 | required: true 29 | size: null 30 | step: null 31 | tip: null 32 | title: null 33 | type: craft\fieldlayoutelements\entries\EntryTitleField 34 | uid: 5f6b0ffc-3351-4869-b4a4-11aee4c1c5e9 35 | userCondition: null 36 | warning: null 37 | width: 100 38 | - 39 | dateAdded: '2025-01-27T11:58:14-05:00' 40 | dismissible: false 41 | elementCondition: null 42 | style: tip 43 | tip: 'Used when displayed on other pages' 44 | type: craft\fieldlayoutelements\Tip 45 | uid: 94e994eb-e860-427a-b9ad-14780fa0043b 46 | userCondition: null 47 | - 48 | dateAdded: '2025-01-27T11:58:14-05:00' 49 | elementCondition: null 50 | fieldUid: c33fedfd-ec76-45db-93dc-a12697e4a2aa # Listing Image 51 | handle: null 52 | includeInCards: false 53 | instructions: null 54 | label: null 55 | providesThumbs: false 56 | required: false 57 | tip: null 58 | type: craft\fieldlayoutelements\CustomField 59 | uid: 58d96b32-eca0-461b-aabf-c80abc32a5a2 60 | userCondition: null 61 | warning: null 62 | width: 25 63 | - 64 | dateAdded: '2025-01-27T11:58:14-05:00' 65 | elementCondition: null 66 | fieldUid: f90a85bd-91b2-462b-acb4-8f265ded647e # Copy 67 | handle: summary 68 | includeInCards: false 69 | instructions: null 70 | label: Summary 71 | providesThumbs: false 72 | required: false 73 | tip: null 74 | type: craft\fieldlayoutelements\CustomField 75 | uid: 572c63a6-9911-4fba-a9a2-702f8c568e66 76 | userCondition: null 77 | warning: null 78 | width: 75 79 | - 80 | dateAdded: '2025-01-27T11:58:14-05:00' 81 | elementCondition: null 82 | heading: 'Main Content' 83 | type: craft\fieldlayoutelements\Heading 84 | uid: 5e79ceb5-58a6-4e1a-84c0-9d25e1fee295 85 | userCondition: null 86 | name: Content 87 | uid: 00dcba48-c8e6-436c-88cf-4362f6b375cc 88 | userCondition: null 89 | - 90 | elementCondition: null 91 | elements: 92 | - 93 | dateAdded: '2025-01-27T11:58:14-05:00' 94 | elementCondition: null 95 | fieldUid: 149ec41c-d6de-4ae5-84db-08d285801dd1 # SEO 96 | handle: null 97 | includeInCards: false 98 | instructions: null 99 | label: null 100 | providesThumbs: false 101 | required: false 102 | tip: null 103 | type: craft\fieldlayoutelements\CustomField 104 | uid: 2e7499cf-96a5-4586-90e6-9eacb5fdbda7 105 | userCondition: null 106 | warning: null 107 | width: 100 108 | name: SEO 109 | uid: 5c2081a7-07bd-42f2-8c3d-66f1639b113a 110 | userCondition: null 111 | handle: newsListing 112 | hasTitleField: true 113 | icon: newspaper 114 | name: 'News Listing' 115 | showSlugField: true 116 | showStatusField: true 117 | slugTranslationKeyFormat: '' 118 | slugTranslationMethod: site 119 | titleFormat: '' 120 | titleTranslationKeyFormat: '' 121 | titleTranslationMethod: site 122 | -------------------------------------------------------------------------------- /templates/_components/contact-form.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 |
5 |
6 | 7 | {% macro errorList(errors) %} 8 | {% if errors %} 9 | {{ ul(errors, {class: 'errors text-red-500'}) }} 10 | {% endif %} 11 | {% endmacro %} 12 | 13 | {# Sets default values if not defined by the input fields below #} 14 | {% set fromName = fromName ?? '' %} 15 | {% set fromEmail = fromEmail ?? '' %} 16 | {% set subject = subject ?? '' %} 17 | {% set message = message ?? '' %} 18 | 19 | {# The `success` variable is defined by the contact form controller on success #} 20 | {% if success is defined and success %} 21 | {# success message here #} 22 |
23 |

{{ fromName }}, Your message was successfully sent!

24 |

25 | Sender Name: {{ fromName }}
26 | Sender Email: {{ fromEmail }}
27 | Subject: {{ subject }}
28 |

29 |
30 | Message:

31 | {{ message|nl2br }} 32 |
33 |
34 | 35 | {% else %} 36 | {# display the form not on the success page #} 37 |
43 | {{ csrfInput() }} 44 | {# {{ actionInput('contact-form/send') }} #} 45 | {# {{ redirectInput('contact/thanks') }} #} 46 | 47 | 48 |

Contact Us

49 | 50 |
51 | {{ input('text', 'fromName', message.fromName ?? '', { 52 | id: 'from-name', 53 | autocomplete: 'name', 54 | class: 'floating-input w-full', 55 | 'aria-label': "Your Name"|t, 56 | placeholder: "Your Name"|t, 57 | 58 | }) }} 59 | 60 | {# {{ message ? _self.errorList(message.getErrors('fromName')) }} #} 61 |
62 | 63 |
64 | {{ input('email', 'fromEmail', message.fromEmail ?? '', { 65 | id: 'from-email', 66 | autocomplete: 'email', 67 | class: 'floating-input w-full', 68 | 'aria-label': "Email"|t, 69 | placeholder: "Email"|t, 70 | }) }} 71 | 72 | {# {{ message ? _self.errorList(message.getErrors('fromEmail')) }} #} 73 |
74 | 75 |
76 | {{ input('text', 'subject', message.subject ?? '', { 77 | id: 'subject', 78 | class: 'floating-input w-full', 79 | 'aria-label': "Submect"|t, 80 | placeholder: "Subject"|t, 81 | }) }} 82 | 83 | {# {{ message ? _self.errorList(message.getErrors('subject')) }} #} 84 |
85 | 86 |
87 | {{ tag('textarea', { 88 | text: message.message ?? '', 89 | id: 'message', 90 | name: 'message', 91 | rows: 10, 92 | cols: 40, 93 | class: 'floating-input w-full', 94 | 'aria-label': "Message"|t, 95 | placeholder: "Message"|t, 96 | }) }} 97 | 98 | {# {{ message ? _self.errorList(message.getErrors('message')) }} #} 99 |
100 | 101 | 102 |
103 | {% endif %} 104 | 105 | 106 | 107 | 108 |
109 |
110 |
-------------------------------------------------------------------------------- /config/project/users/groups/siteAdmin--0878c4de-b946-4c8e-bcce-fe18cd77a73e.yaml: -------------------------------------------------------------------------------- 1 | description: null 2 | handle: siteAdmin 3 | name: 'Site Admin' 4 | permissions: 5 | - accesscp 6 | - accessplugin-seomatic 7 | - accessplugin-usermanual 8 | - 'assignusergroup:0878c4de-b946-4c8e-bcce-fe18cd77a73e' # Site Admin 9 | - 'createentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 10 | - 'createentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 11 | - 'createfolders:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 12 | - 'createfolders:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 13 | - 'deleteassets:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 14 | - 'deleteassets:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 15 | - 'deleteentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 16 | - 'deleteentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 17 | - 'deletepeerassets:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 18 | - 'deletepeerassets:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 19 | - 'deletepeerentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 20 | - 'deletepeerentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 21 | - 'deletepeerentrydrafts:29d88d99-dd38-43f6-9ac5-3438833c75ba' # Error 404 22 | - 'deletepeerentrydrafts:408314ae-e32d-471b-a729-25f4ce759ac4' # Notice Bar 23 | - 'deletepeerentrydrafts:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 24 | - 'deletepeerentrydrafts:9c12e5ad-18e9-498f-bf50-489513409007' # News 25 | - 'editglobalset:415a954c-eb55-4533-9ffd-64b3eade9469' # Fallback 26 | - 'editimages:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 27 | - 'editimages:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 28 | - 'editpeerimages:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 29 | - 'editpeerimages:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 30 | - 'editsite:1a78d395-d81a-4b77-8da7-30a49123bbee' # English 31 | - 'editsite:b9fdef79-5b63-4932-a9aa-8d18f937e6d9' # Français 32 | - 'replacefiles:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 33 | - 'replacefiles:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 34 | - 'replacepeerfiles:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 35 | - 'replacepeerfiles:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 36 | - 'saveassets:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 37 | - 'saveassets:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 38 | - 'saveentries:29d88d99-dd38-43f6-9ac5-3438833c75ba' # Error 404 39 | - 'saveentries:408314ae-e32d-471b-a729-25f4ce759ac4' # Notice Bar 40 | - 'saveentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 41 | - 'saveentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 42 | - 'savepeerassets:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 43 | - 'savepeerassets:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 44 | - 'savepeerentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 45 | - 'savepeerentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 46 | - 'savepeerentrydrafts:29d88d99-dd38-43f6-9ac5-3438833c75ba' # Error 404 47 | - 'savepeerentrydrafts:408314ae-e32d-471b-a729-25f4ce759ac4' # Notice Bar 48 | - 'savepeerentrydrafts:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 49 | - 'savepeerentrydrafts:9c12e5ad-18e9-498f-bf50-489513409007' # News 50 | - 'seomatic:content-meta' 51 | - 'seomatic:content-meta:facebook' 52 | - 'seomatic:content-meta:general' 53 | - 'seomatic:content-meta:sitemap' 54 | - 'seomatic:content-meta:twitter' 55 | - 'seomatic:dashboard' 56 | - 'seomatic:global-meta' 57 | - 'seomatic:global-meta:facebook' 58 | - 'seomatic:global-meta:general' 59 | - 'seomatic:global-meta:robots' 60 | - 'seomatic:global-meta:twitter' 61 | - 'seomatic:site-settings' 62 | - 'seomatic:site-settings:identity' 63 | - 'seomatic:site-settings:sitemap' 64 | - 'seomatic:site-settings:social' 65 | - 'seomatic:tracking-scripts' 66 | - 'seomatic:tracking-scripts:googleanalytics' 67 | - 'seomatic:tracking-scripts:googletagmanager' 68 | - 'seomatic:tracking-scripts:gtag' 69 | - 'utility:asset-indexes' 70 | - 'utility:db-backup' 71 | - 'utility:system-report' 72 | - 'viewassets:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 73 | - 'viewassets:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 74 | - 'viewentries:29d88d99-dd38-43f6-9ac5-3438833c75ba' # Error 404 75 | - 'viewentries:408314ae-e32d-471b-a729-25f4ce759ac4' # Notice Bar 76 | - 'viewentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 77 | - 'viewentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 78 | - 'viewpeerassets:70f5d47b-4830-4d51-95fe-bc0f7ccc0670' # Uploads 79 | - 'viewpeerassets:d19b4314-0267-4e95-9e63-2462a334eea1' # User Guide 80 | - 'viewpeerentries:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 81 | - 'viewpeerentries:9c12e5ad-18e9-498f-bf50-489513409007' # News 82 | - 'viewpeerentrydrafts:29d88d99-dd38-43f6-9ac5-3438833c75ba' # Error 404 83 | - 'viewpeerentrydrafts:408314ae-e32d-471b-a729-25f4ce759ac4' # Notice Bar 84 | - 'viewpeerentrydrafts:666b31c2-d6d5-4e80-b9aa-f57b66d5b54a' # Pages 85 | - 'viewpeerentrydrafts:9c12e5ad-18e9-498f-bf50-489513409007' # News 86 | -------------------------------------------------------------------------------- /templates/_layout.twig: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | {# 14 | google fonts 15 | go locally hosted google fonts before 16 | launching the live site - this will improve 17 | page speed scores and site performance 18 | https://gwfh.mranftl.com/fonts 19 | #} 20 | 21 | 22 | {# end google #} 23 | 24 | 27 | 28 | {# vendor css #} 29 | 30 | {# site css #} 31 | 32 | 33 | 34 | 35 | {# for safari https://medium.com/swlh/are-you-using-svg-favicons-yet-a-guide-for-modern-browsers-836a6aace3df #} 36 | 37 | 38 | 39 | {% block pageCss %}{% endblock %} 40 | 41 | 42 | 43 | 44 | 45 | {# set site name from DOTENV variable based on current site language #} 46 | {% if craft.app.language == 'en' %} 47 | {% set siteName = getenv('SITE_NAME_EN') %} 48 | {% endif %} 49 | {% if craft.app.language == 'fr' %} 50 | {% set siteName = getenv('SITE_NAME_FR') %} 51 | {% endif %} 52 | 53 |
54 | {# 55 | // use below header for sticky header that disappears on scroll down but reappears on scroll up 56 | #} 57 | {#
#} 92 | 93 | 94 | 95 | Skip to main content 96 | 97 | {% include "_includes/notice-bar" %} 98 | 99 | {# 100 | // main nav click dropdown this is better user experience 101 | // and better for accessibility 102 | // works with tertiary level dropdowns 103 | #} 104 | {% include '_includes/main-nav' %} 105 | 106 | {# 107 | // main nav hover dropdown 108 | // we use this when client insists on hover dropdowns 109 | // does NOT work with tertiary dropdowns 110 | // this is a little buggy at mobile and 111 | // needs work 112 | // also STRONGLY recommend to avoid due to 113 | // ACCESSIBILTY and USABILITY issues 114 | #} 115 | {# {% include '_includes/main-nav-hover' %} #} 116 | 117 | 118 |
119 | 120 |
121 | 122 | {% block content %}{% endblock %} 123 |
124 | 125 |
126 | {% include '_includes/footer' %} 127 |
128 | 129 | 130 | 131 | 132 | 133 | {% block pageJs %}{% endblock %} 134 | 135 | 136 | -------------------------------------------------------------------------------- /config/project/entryTypes/news--51b9c3fc-be2a-4ef3-9f2c-66372327c604.yaml: -------------------------------------------------------------------------------- 1 | color: emerald 2 | fieldLayouts: 3 | 171a213e-9b33-49e7-bf1d-8056ef4d5c12: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | dateAdded: '2025-01-27T11:58:14-05:00' 14 | disabled: false 15 | elementCondition: null 16 | id: null 17 | includeInCards: false 18 | inputType: null 19 | instructions: null 20 | label: null 21 | max: null 22 | min: null 23 | name: null 24 | orientation: null 25 | placeholder: null 26 | providesThumbs: false 27 | readonly: false 28 | required: true 29 | size: null 30 | step: null 31 | tip: null 32 | title: null 33 | type: craft\fieldlayoutelements\entries\EntryTitleField 34 | uid: 514527a7-c517-4adb-9d54-efdb1f6be1b0 35 | userCondition: null 36 | warning: null 37 | width: 100 38 | - 39 | dateAdded: '2025-01-27T11:58:14-05:00' 40 | dismissible: false 41 | elementCondition: null 42 | style: tip 43 | tip: 'Summary should only be 2-3 sentences. Image will appear on listing page' 44 | type: craft\fieldlayoutelements\Tip 45 | uid: f4aec492-bb0f-40b0-afbf-79a590fca8be 46 | userCondition: null 47 | - 48 | dateAdded: '2025-01-27T11:58:14-05:00' 49 | elementCondition: null 50 | fieldUid: b2f53aa5-81a3-466c-af2d-e30dab4ed3d8 # Image 51 | handle: null 52 | includeInCards: false 53 | instructions: null 54 | label: null 55 | providesThumbs: true 56 | required: false 57 | tip: null 58 | type: craft\fieldlayoutelements\CustomField 59 | uid: 23da011a-390b-4e37-89a2-4b97651ed706 60 | userCondition: null 61 | warning: null 62 | width: 50 63 | - 64 | dateAdded: '2025-01-27T11:58:14-05:00' 65 | elementCondition: null 66 | fieldUid: f90a85bd-91b2-462b-acb4-8f265ded647e # Copy 67 | handle: summary 68 | includeInCards: false 69 | instructions: null 70 | label: Summary 71 | providesThumbs: false 72 | required: false 73 | tip: null 74 | type: craft\fieldlayoutelements\CustomField 75 | uid: 0ef618f6-08b3-4fcc-a915-60ee481fb8dd 76 | userCondition: null 77 | warning: null 78 | width: 50 79 | - 80 | dateAdded: '2025-01-27T11:58:14-05:00' 81 | elementCondition: null 82 | fieldUid: fbdde691-0df2-4e8e-b1a8-61a1f555fd0e # News Categories 83 | handle: null 84 | includeInCards: false 85 | instructions: null 86 | label: null 87 | providesThumbs: false 88 | required: false 89 | tip: null 90 | type: craft\fieldlayoutelements\CustomField 91 | uid: fbaff3bd-2fb9-4f11-a784-51688db844d5 92 | userCondition: null 93 | warning: null 94 | width: 100 95 | - 96 | dateAdded: '2025-01-27T11:58:14-05:00' 97 | elementCondition: null 98 | heading: 'Main Content' 99 | type: craft\fieldlayoutelements\Heading 100 | uid: d7089c82-6c41-4d83-846b-4bafe2301bac 101 | userCondition: null 102 | name: Content 103 | uid: daf8662e-c051-40ce-9a9f-055743873cb4 104 | userCondition: null 105 | - 106 | elementCondition: null 107 | elements: 108 | - 109 | dateAdded: '2025-01-27T11:58:14-05:00' 110 | elementCondition: null 111 | fieldUid: 149ec41c-d6de-4ae5-84db-08d285801dd1 # SEO 112 | handle: null 113 | includeInCards: false 114 | instructions: null 115 | label: null 116 | providesThumbs: false 117 | required: false 118 | tip: null 119 | type: craft\fieldlayoutelements\CustomField 120 | uid: c8a6d8cd-2973-4ae5-a913-4014dabf5dab 121 | userCondition: null 122 | warning: null 123 | width: 100 124 | name: SEO 125 | uid: a5bc70bc-debf-4ef0-bf9f-162f96619557 126 | userCondition: null 127 | handle: news 128 | hasTitleField: true 129 | icon: radio 130 | name: News 131 | showSlugField: true 132 | showStatusField: true 133 | slugTranslationKeyFormat: '' 134 | slugTranslationMethod: site 135 | titleFormat: '' 136 | titleTranslationKeyFormat: '' 137 | titleTranslationMethod: site 138 | -------------------------------------------------------------------------------- /templates/search/_components/search.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 | {# search sprig component #} 4 | 5 | {# Ensure reset variable exists #} 6 | {% set reset = reset ?? false %} 7 | 8 | {% set page = reset ? 1 : (page ?? 1) %} 9 | 10 | {# 11 | set search parameter here 12 | if query search is the query 13 | if no query then search is an empty space so there are no initial results displaying 14 | #} 15 | {% set search = reset ? '' : (q ?? '') %} 16 | 17 | {# 18 | // need above values in hidden inputs for persistent state 19 | // https://github.com/putyourlightson/craft-sprig/issues/71#issuecomment-745388432 20 | #} 21 | {{ hiddenInput('page', page) }} 22 | {{ hiddenInput('search', search) }} 23 | 24 |
25 |
26 |
27 | 28 |
29 | {#
32 | {# label for screenreader } 33 | 34 | 35 | {# faux label that slides up on input focus } 36 |

40 | {{ "Search site"|t }} 41 |

42 | 55 |
#} 56 | 57 |
58 | 71 | 75 |
76 | 77 | 81 | 82 | 86 |
87 | 88 |
89 | 90 | {# 91 | search all sections except siteWideElements and user guide 92 | #} 93 | {% set entryQuery = craft.entries 94 | .section('and, not siteWideElements, not userGuide, not error404') 95 | .orderBy('') 96 | .limit(limit) 97 | .search(search) %} 98 | 99 | {# Paginates the entry query given the current page #} 100 | {% set pageInfo = sprig.paginate(entryQuery, page) %} 101 | {% set entries = pageInfo.pageResults %} 102 | 103 | 104 | {# 105 | // id="results" so that sprig only refreshes this div 106 | // when typing into the search input 107 | #} 108 |
109 | {# search results here #} 110 | {% if search != null %} 111 | {% for entry in entries %} 112 | {% include "search/_search-item" %} 113 | {% endfor %} 114 | {% else %} 115 |
116 |

No Search Query

117 |
118 | {% endif %} 119 | 120 |
121 | 122 | 123 |
124 |
125 | 126 | 127 | {% do sprig.pushUrl('?' ~ {q: search, page: page}|url_encode) %} -------------------------------------------------------------------------------- /templates/_includes/dark-mode.twig: -------------------------------------------------------------------------------- 1 | {{ craft.app.config.general.devMode ? ('') | raw }} 2 | 3 |
4 | 5 |

dark mode

6 | 7 | {# light #} 8 | 20 | 21 | {# dark #} 22 | 30 | 31 | {# system #} 32 | 64 |
-------------------------------------------------------------------------------- /templates/criticalCss/index_critical.min.css: -------------------------------------------------------------------------------- 1 | :root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}button{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button{text-transform:none}button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}h1,p{margin:0}button{background-color:transparent;background-image:none}ul{margin:0;padding:0}ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #e5e7eb}img{border-style:solid}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button{padding:0;line-height:inherit;color:inherit}img,svg{display:block;vertical-align:middle}img{max-width:100%;height:auto}*{--tw-shadow:0 0 transparent;--tw-ring-inset:var(--tw-empty, );/*!*//*!*/--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.container{width:100%;margin-right:auto;margin-left:auto}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}[x-cloak]{display:none}html{scroll-behavior:smooth}body{font-family:HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif}a.skip-main{left:-999px;position:absolute;top:40px;width:1px;height:1px;overflow:hidden;z-index:-999;background:#2d2828}nav ul li ul{width:100%;background-color:rgba(255,255,255,var(--tw-bg-opacity));--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity));padding:.25rem 0 .25rem 2rem}@media (min-width:1024px){nav ul li ul{position:absolute;left:0;width:180px;min-width:180px;max-width:180px;border-radius:.375rem;padding-left:0;--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);-webkit-box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}}nav ul li ul{z-index:9999;right:-20px}nav ul li a{display:block;background-color:transparent}nav ul li ul ul{top:0;right:-180px;left:auto!important}nav ul li ul li{clear:both;width:100%}nav ul li img{position:absolute;right:10px;top:calc(50% - 4px)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.relative{position:relative}.m-0{margin:0}.my-24{margin-top:6rem;margin-bottom:6rem}.mx-auto{margin-left:auto;margin-right:auto}.mr-8{margin-right:2rem}.mr-1{margin-right:.25rem}.block{display:block}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.hidden{display:none}.h-6{height:1.5rem}.h-screen{height:100vh}.w-full{width:100%}.w-6{width:1.5rem}.flex-grow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.rounded-lg{border-radius:.5rem}.border-b{border-bottom-width:1px}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.border-opacity-\[0\.2\]{--tw-border-opacity:0.2}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.p-20{padding:5rem}.p-2{padding:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.pb-4{padding-bottom:1rem}.pl-0{padding-left:0}.text-center{text-align:center}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-widest{letter-spacing:.1em}.text-grayBrand{--tw-text-opacity:1;color:rgba(55,63,65,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}@media (min-width:768px){.md\:mr-12{margin-right:3rem}}@media (min-width:1024px){.lg\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.lg\:inline-block{display:inline-block}.lg\:hidden{display:none}.lg\:h-auto{height:auto}.lg\:flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.lg\:justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.lg\:px-0{padding-left:0;padding-right:0}.lg\:pb-0{padding-bottom:0}.lg\:text-xs{font-size:.75rem;line-height:1rem}}@media (min-width:1280px){.xl\:px-0{padding-left:0;padding-right:0}} --------------------------------------------------------------------------------