Site build

This commit is contained in:
Stewart Walter 2026-05-01 12:28:23 +01:00
parent db57fde9c4
commit 08d696985a
63 changed files with 4465 additions and 2243 deletions

294
.ddev/config.yaml Normal file
View File

@ -0,0 +1,294 @@
name: ukhorsecremations.co.uk
type: symfony
docroot: public
php_version: "8.4"
webserver_type: nginx-fpm
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
database:
type: mariadb
version: "11.8"
use_dns_when_possible: true
composer_version: "2"
web_environment: []
corepack_enable: false
# Key features of DDEV's config.yaml:
# name: <projectname> # Name of the project, automatically provides
# http://projectname.ddev.site and https://projectname.ddev.site
# If the name is omitted, the project will take the name of the enclosing directory,
# which is useful if you want to have a copy of the project side by side with this one.
# type: <projecttype> # backdrop, cakephp, codeigniter, craftcms, drupal, drupal6, drupal7, drupal8, drupal9, drupal10, drupal11, drupal12, generic, laravel, magento, magento2, php, shopware6, silverstripe, symfony, typo3, wordpress
# See https://docs.ddev.com/en/stable/users/quickstart/ for more
# information on the different project types
# docroot: <relative_path> # Relative path to the directory containing index.php.
# php_version: "8.4" # PHP version to use, "5.6" through "8.5"
# You can explicitly specify the webimage but this
# is not recommended, as the images are often closely tied to DDEV's' behavior,
# so this can break upgrades.
# webimage: <docker_image>
# Its unusual to change this option, and we dont recommend it without Docker experience and a good reason.
# Typically, this means additions to the existing web image using a .ddev/web-build/Dockerfile.*
# database:
# type: <dbtype> # mysql, mariadb, postgres
# version: <version> # database version, like "10.11" or "8.0"
# MariaDB versions can be 5.5-10.8, 10.11, 11.4, 11.8
# MySQL versions can be 5.5-8.0, 8.4
# PostgreSQL versions can be 9-18
# router_http_port: <port> # Port to be used for http (defaults to global configuration, usually 80)
# router_https_port: <port> # Port for https (defaults to global configuration, usually 443)
# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart"
# Note that for most people the commands
# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better,
# as leaving Xdebug enabled all the time is a big performance hit.
# xhgui_http_port: "8143"
# xhgui_https_port: "8142"
# The XHGui ports can be changed from the default 8143 and 8142
# Very rarely used
# host_xhgui_port: "8142"
# Can be used to change the host binding port of the XHGui
# application. Rarely used; only when port conflict and
# bind_all_ports is used (normally with router disabled)
# xhprof_mode: [prepend|xhgui|global]
# Default is "xhgui"
# webserver_type: nginx-fpm, apache-fpm, generic
# timezone: Europe/Berlin
# If timezone is unset, DDEV will attempt to derive it from the host system timezone
# using the $TZ environment variable or the /etc/localtime symlink.
# This is the timezone used in the containers and by PHP;
# it can be set to any valid timezone,
# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# For example Europe/Dublin or MST7MDT
# composer_root: <relative_path>
# Relative path to the Composer root directory from the project root. This is
# the directory which contains the composer.json and where all Composer related
# commands are executed.
# composer_version: "2"
# You can set it to "" or "2" (default) for Composer v2
# to use the latest major version available at the time your container is built.
# It is also possible to use each other Composer version channel. This includes:
# - 2.2 (latest Composer LTS version)
# - stable
# - preview
# - snapshot
# Alternatively, an explicit Composer version may be specified, for example "2.2.18".
# To reinstall Composer after the image was built, run "ddev utility rebuild".
# nodejs_version: "24"
# change from the default system Node.js version to any other version.
# See https://docs.ddev.com/en/stable/users/configuration/config/#nodejs_version for more information
# and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation.
# corepack_enable: false
# Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm
# additional_hostnames:
# - somename
# - someothername
# would provide http and https URLs for "somename.ddev.site"
# and "someothername.ddev.site".
# additional_fqdns:
# - example.com
# - sub1.example.com
# would provide http and https URLs for "example.com" and "sub1.example.com"
# Please take care with this because it can cause great confusion.
# upload_dirs: "custom/upload/dir"
#
# upload_dirs:
# - custom/upload/dir
# - ../private
#
# would set the destination paths for ddev import-files to <docroot>/custom/upload/dir
# When Mutagen is enabled this path is bind-mounted so that all the files
# in the upload_dirs don't have to be synced into Mutagen.
# disable_upload_dirs_warning: false
# If true, turns off the normal warning that says
# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set"
# ddev_version_constraint: ""
# Example:
# ddev_version_constraint: ">= 1.24.8"
# This will enforce that the running ddev version is within this constraint.
# See https://github.com/Masterminds/semver#checking-version-constraints for
# supported constraint formats
# working_dir:
# web: /var/www/html
# db: /home
# would set the default working directory for the web and db services.
# These values specify the destination directory for ddev ssh and the
# directory in which commands passed into ddev exec are run.
# omit_containers: [db, ddev-ssh-agent]
# Currently only these containers are supported. Some containers can also be
# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit
# the "db" container, several standard features of DDEV that access the
# database container will be unusable. In the global configuration it is also
# possible to omit ddev-router, but not here.
# performance_mode: "global"
# DDEV offers performance optimization strategies to improve the filesystem
# performance depending on your host system. Should be configured globally.
#
# If set, will override the global config. Possible values are:
# - "global": uses the value from the global config.
# - "none": disables performance optimization for this project.
# - "mutagen": enables Mutagen for this project.
#
# See https://docs.ddev.com/en/stable/users/install/performance/#mutagen
# fail_on_hook_fail: False
# Decide whether 'ddev start' should be interrupted by a failing hook
# host_https_port: "59002"
# The host port binding for https can be explicitly specified. It is
# dynamic unless otherwise specified.
# This is not used by most people, most people use the *router* instead
# of the localhost port.
# host_webserver_port: "59001"
# The host port binding for the ddev-webserver can be explicitly specified. It is
# dynamic unless otherwise specified.
# This is not used by most people, most people use the *router* instead
# of the localhost port.
# host_db_port: "59002"
# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic
# unless explicitly specified.
# mailpit_http_port: "8025"
# mailpit_https_port: "8026"
# The Mailpit ports can be changed from the default 8025 and 8026
# host_mailpit_port: "8025"
# The mailpit port is not normally bound on the host at all, instead being routed
# through ddev-router, but it can be bound directly to localhost if specified here.
# webimage_extra_packages: ['php${DDEV_PHP_VERSION}-tidy', 'php${DDEV_PHP_VERSION}-yac']
# Extra Debian packages that are needed in the webimage can be added here
# dbimage_extra_packages: [netcat, telnet, sudo]
# Extra Debian packages that are needed in the dbimage can be added here
# use_dns_when_possible: true
# If the host has internet access and the domain configured can
# successfully be looked up, DNS will be used for hostname resolution
# instead of editing /etc/hosts
# Defaults to true
# project_tld: ddev.site
# The top-level domain used for project URLs
# The default "ddev.site" allows DNS lookup via a wildcard
# share_default_provider: ngrok
# The default share provider to use for "ddev share"
# Defaults to global configuration, usually "ngrok"
# Can be "ngrok" or "cloudflared" or the name of a custom provider from .ddev/share-providers/
# share_provider_args: --basic-auth username:pass1234
# Provide extra flags to the share provider script
# See https://docs.ddev.com/en/stable/users/configuration/config/#share_provider_args
# disable_settings_management: false
# If true, DDEV will not create CMS-specific settings files like
# Drupal's settings.php/settings.ddev.php or TYPO3's additional.php
# In this case the user must provide all such settings.
# You can inject environment variables into the web container with:
# web_environment:
# - SOMEENV=somevalue
# - SOMEOTHERENV=someothervalue
# no_project_mount: false
# (Experimental) If true, DDEV will not mount the project into the web container;
# the user is responsible for mounting it manually or via a script.
# This is to enable experimentation with alternate file mounting strategies.
# For advanced users only!
# bind_all_interfaces: false
# If true, host ports will be bound on all network interfaces,
# not the localhost interface only. This means that ports
# will be available on the local network if the host firewall
# allows it.
# default_container_timeout: 120
# The default time that DDEV waits for all containers to become ready can be increased from
# the default 120. This helps in importing huge databases, for example.
#web_extra_exposed_ports:
#- name: nodejs
# container_port: 3000
# http_port: 2999
# https_port: 3000
#- name: something
# container_port: 4000
# https_port: 4000
# http_port: 3999
# Allows a set of extra ports to be exposed via ddev-router
# Fill in all three fields even if you dont intend to use the https_port!
# If you dont add https_port, then it defaults to 0 and ddev-router will fail to start.
#
# The port behavior on the ddev-webserver must be arranged separately, for example
# using web_extra_daemons.
# For example, with a web app on port 3000 inside the container, this config would
# expose that web app on https://<project>.ddev.site:9999 and http://<project>.ddev.site:9998
# web_extra_exposed_ports:
# - name: myapp
# container_port: 3000
# http_port: 9998
# https_port: 9999
#web_extra_daemons:
#- name: "http-1"
# command: "/var/www/html/node_modules/.bin/http-server -p 3000"
# directory: /var/www/html
#- name: "http-2"
# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000"
# directory: /var/www/html
# override_config: false
# By default, config.*.yaml files are *merged* into the configuration
# But this means that some things can't be overridden
# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge
# and you can't erase existing hooks or all environment variables.
# However, with "override_config: true" in a particular config.*.yaml file,
# 'use_dns_when_possible: false' can override the existing values, and
# hooks:
# post-start: []
# or
# web_environment: []
# or
# additional_hostnames: []
# can have their intended affect. 'override_config' affects only behavior of the
# config.*.yaml file it exists in.
# Many DDEV commands can be extended to run tasks before or after the
# DDEV command is executed, for example "post-start", "post-import-db",
# "pre-composer", "post-composer"
# See https://docs.ddev.com/en/stable/users/extend/custom-commands/ for more
# information on the commands that can be extended and the tasks you can define
# for them. Example:
#hooks:
## Un-comment to consume async message.
# post-start:
# - exec: symfony run --daemon --watch=config,src,templates,vendor bin/console messenger:consume async -vv

View File

@ -0,0 +1,99 @@
#!/usr/bin/env bash
#ddev-generated
# cloudflared share provider for DDEV
# Documentation: https://docs.ddev.com/en/stable/users/topics/sharing/
#
# To customize: remove the 'ddev-generated' line above and edit as needed.
#
# Quick tunnel (default): Creates a temporary URL like https://xxx.trycloudflare.com
# No configuration needed - just run `ddev share --provider=cloudflared`
#
# Named tunnel (custom domain): Use your own domain managed by Cloudflare
# 1. Create tunnel: cloudflared tunnel create my-tunnel
# 2. Add DNS: cloudflared tunnel route dns my-tunnel mysite.example.com
# 3. Configure: ddev config --share-provider-args="--tunnel my-tunnel --hostname mysite.example.com"
# (--hostname tells DDEV what URL to display; DNS routing is done in step 2)
# 4. Run: ddev share --provider=cloudflared
set -euo pipefail
# Enable debug output if DDEV_DEBUG or DDEV_VERBOSE is set
if [[ "${DDEV_DEBUG:-}" == "true" ]] || [[ "${DDEV_VERBOSE:-}" == "true" ]]; then
set -x
fi
# Validate cloudflared is installed
if ! command -v cloudflared >/dev/null 2>&1; then
echo "Error: cloudflared not found in PATH." >&2
echo "Install from https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/" >&2
exit 1
fi
# Validate required environment variables
if [[ -z "${DDEV_LOCAL_URL:-}" ]]; then
echo "Error: DDEV_LOCAL_URL not set" >&2
exit 1
fi
# Start cloudflared and capture output
echo "Starting cloudflared tunnel..." >&2
# Parse args to determine tunnel mode
# --tunnel and --hostname are DDEV-specific and stripped before passing to cloudflared
ARGS="${DDEV_SHARE_ARGS:-}"
TUNNEL_NAME=""
HOSTNAME=""
# Check for named tunnel mode (--tunnel flag present)
# Supports both --tunnel my-tunnel and --tunnel=my-tunnel
if [[ "$ARGS" =~ --tunnel([[:space:]]+|=)([^[:space:]]+) ]]; then
TUNNEL_NAME="${BASH_REMATCH[2]}"
ARGS=$(echo "$ARGS" | sed -E 's/--tunnel([[:space:]]+|=)[^[:space:]]+//')
fi
# Extract hostname if present (for URL output only - not passed to cloudflared)
# Supports both --hostname mysite.example.com and --hostname=mysite.example.com
if [[ "$ARGS" =~ --hostname([[:space:]]+|=)([^[:space:]]+) ]]; then
HOSTNAME="${BASH_REMATCH[2]}"
ARGS=$(echo "$ARGS" | sed -E 's/--hostname([[:space:]]+|=)[^[:space:]]+//')
fi
# Normalize whitespace left over from stripping flags
ARGS=$(echo "$ARGS" | sed -E 's/[[:space:]]+/ /g;s/^ //;s/ $//')
# For named tunnels with known hostname, output URL immediately
URL_FOUND=""
if [[ -n "$HOSTNAME" ]]; then
echo "https://$HOSTNAME" # Output to stdout - CRITICAL: This is captured by DDEV
URL_FOUND="https://$HOSTNAME"
fi
# Build and run the cloudflared command, piping all output through the reader
# Using --protocol http2 for better compatibility
if [[ -n "$TUNNEL_NAME" ]]; then
echo "Using named tunnel: $TUNNEL_NAME" >&2
echo >&2
echo "Running command: cloudflared --url $DDEV_LOCAL_URL --protocol http2${ARGS:+ $ARGS} tunnel run $TUNNEL_NAME" >&2
echo >&2
cloudflared --url "$DDEV_LOCAL_URL" --protocol http2 $ARGS tunnel run "$TUNNEL_NAME" 2>&1
else
echo >&2
echo "Running command: cloudflared tunnel --url $DDEV_LOCAL_URL --protocol http2 $ARGS" >&2
echo >&2
cloudflared tunnel --url "$DDEV_LOCAL_URL" --protocol http2 $ARGS 2>&1
fi | while IFS= read -r line; do
# For quick tunnels, look for the cloudflared URL in the output
# Exclude api.trycloudflare.com which appears in error messages
if [[ -z "$URL_FOUND" ]] && [[ "$line" =~ https://[a-z0-9-]+\.trycloudflare\.com ]]; then
POTENTIAL_URL="${BASH_REMATCH[0]}"
if [[ ! "$POTENTIAL_URL" =~ api\.trycloudflare\.com ]]; then
URL_FOUND="$POTENTIAL_URL"
echo "$URL_FOUND" # Output to stdout - CRITICAL: This is captured by DDEV
fi
fi
# Show non-info output to user (warnings, errors, etc.); show all in verbose mode
if [[ "${DDEV_VERBOSE:-}" == "true" ]] || [[ ! "$line" =~ " INF " ]]; then
echo "$line" >&2
fi
done

49
.ddev/share-providers/ngrok.sh Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env bash
#ddev-generated
# ngrok share provider for DDEV
# Documentation: https://docs.ddev.com/en/stable/users/topics/sharing/
#
# To customize: remove the 'ddev-generated' line above and edit as needed.
# To create a variant: copy to a new file like my-ngrok.sh
set -euo pipefail
# Enable debug output if DDEV_DEBUG or DDEV_VERBOSE is set
if [[ "${DDEV_DEBUG:-}" == "true" ]] || [[ "${DDEV_VERBOSE:-}" == "true" ]]; then
set -x
fi
# Validate ngrok is installed
if ! command -v ngrok >/dev/null 2>&1; then
echo "Error: ngrok not found in PATH. Install from https://ngrok.com/download" >&2
exit 1
fi
# Validate required environment variables
if [[ -z "${DDEV_LOCAL_URL:-}" ]]; then
echo "Error: DDEV_LOCAL_URL not set" >&2
exit 1
fi
# Start ngrok and capture output
echo "Starting ngrok tunnel..." >&2
ARGS="${DDEV_SHARE_ARGS:-}"
echo >&2
echo "Running command: ngrok http $DDEV_LOCAL_URL --log=stdout $ARGS" >&2
echo >&2
URL_FOUND=""
ngrok http "$DDEV_LOCAL_URL" --log=stdout $ARGS 2>&1 | while IFS= read -r line; do
# Look for the tunnel URL in ngrok's structured log output
if [[ -z "$URL_FOUND" ]] && [[ "$line" =~ url=(https://[^[:space:]]+) ]]; then
URL_FOUND="${BASH_REMATCH[1]}"
echo "$URL_FOUND" # Output to stdout - CRITICAL: This is captured by DDEV
fi
# Show non-info output to user (warnings, errors, etc.); show all in verbose mode
if [[ "${DDEV_VERBOSE:-}" == "true" ]] || [[ ! "$line" =~ " lvl=info " ]]; then
echo "$line" >&2
fi
done

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
.DS_Store
node_modules/
###> symfony/framework-bundle ### ###> symfony/framework-bundle ###
/.env.local /.env.local

10
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
# Default ignored files
/shelf/
/workspace.xml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="de.php_perfect.intellij.ddev.settings.DdevSettingsState">
<option name="ddevBinary" value="/opt/homebrew/bin/ddev" />
</component>
</project>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

14
.idea/dataSources.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="DDEV" uuid="e10000ea-2841-492a-9fba-ac1589ffd06d">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<configured-by-url>true</configured-by-url>
<remarks>DDEV generated data source</remarks>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://127.0.0.1:-1/db?user=db&amp;password=db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

8
.idea/laravel-idea.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="InertiaPackage">
<option name="directoryPaths">
<list />
</option>
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ukhorsecremations.co.uk.iml" filepath="$PROJECT_DIR$/.idea/ukhorsecremations.co.uk.iml" />
</modules>
</component>
</project>

207
.idea/php.xml Normal file
View File

@ -0,0 +1,207 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MessDetector">
<phpmd_settings>
<phpmd_by_interpreter asDefaultInterpreter="true" interpreter_id="c9381756-41ec-4dee-a9d4-5e84e9eed8d8" timeout="30000" />
</phpmd_settings>
</component>
<component name="MessDetectorOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCSFixerOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCodeSnifferOptionsConfiguration">
<option name="highlightLevel" value="WARNING" />
<option name="transferred" value="true" />
</component>
<component name="PhpCodeSniffer">
<phpcs_settings>
<phpcs_by_interpreter asDefaultInterpreter="true" interpreter_id="c9381756-41ec-4dee-a9d4-5e84e9eed8d8" timeout="30000" />
</phpcs_settings>
</component>
<component name="PhpIncludePathManager">
<include_path>
<path value="$PROJECT_DIR$/vendor/composer" />
<path value="$PROJECT_DIR$/vendor/psr/event-dispatcher" />
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-common" />
<path value="$PROJECT_DIR$/vendor/psr/link" />
<path value="$PROJECT_DIR$/vendor/phpdocumentor/type-resolver" />
<path value="$PROJECT_DIR$/vendor/psr/log" />
<path value="$PROJECT_DIR$/vendor/psr/cache" />
<path value="$PROJECT_DIR$/vendor/psr/clock" />
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-docblock" />
<path value="$PROJECT_DIR$/vendor/theseer/tokenizer" />
<path value="$PROJECT_DIR$/vendor/webmozart/assert" />
<path value="$PROJECT_DIR$/vendor/symfony/asset-mapper" />
<path value="$PROJECT_DIR$/vendor/symfony/runtime" />
<path value="$PROJECT_DIR$/vendor/monolog/monolog" />
<path value="$PROJECT_DIR$/vendor/symfony/var-exporter" />
<path value="$PROJECT_DIR$/vendor/symfony/form" />
<path value="$PROJECT_DIR$/vendor/symfony/expression-language" />
<path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/clock" />
<path value="$PROJECT_DIR$/vendor/psr/container" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-php85" />
<path value="$PROJECT_DIR$/vendor/symfony/options-resolver" />
<path value="$PROJECT_DIR$/vendor/symfony/var-dumper" />
<path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher" />
<path value="$PROJECT_DIR$/vendor/symfony/security-csrf" />
<path value="$PROJECT_DIR$/vendor/symfony/stopwatch" />
<path value="$PROJECT_DIR$/vendor/symfony/flex" />
<path value="$PROJECT_DIR$/vendor/symfony/password-hasher" />
<path value="$PROJECT_DIR$/vendor/symfony/property-info" />
<path value="$PROJECT_DIR$/vendor/symfony/security-core" />
<path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/property-access" />
<path value="$PROJECT_DIR$/vendor/symfony/monolog-bundle" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme" />
<path value="$PROJECT_DIR$/vendor/symfony/cache" />
<path value="$PROJECT_DIR$/vendor/symfony/css-selector" />
<path value="$PROJECT_DIR$/vendor/symfony/routing" />
<path value="$PROJECT_DIR$/vendor/symfony/intl" />
<path value="$PROJECT_DIR$/vendor/symfony/http-client-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/http-client" />
<path value="$PROJECT_DIR$/vendor/symfony/web-link" />
<path value="$PROJECT_DIR$/vendor/doctrine/lexer" />
<path value="$PROJECT_DIR$/vendor/symfony/stimulus-bundle" />
<path value="$PROJECT_DIR$/vendor/symfony/finder" />
<path value="$PROJECT_DIR$/vendor/phpstan/phpdoc-parser" />
<path value="$PROJECT_DIR$/vendor/symfony/security-bundle" />
<path value="$PROJECT_DIR$/vendor/doctrine/deprecations" />
<path value="$PROJECT_DIR$/vendor/symfony/service-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/validator" />
<path value="$PROJECT_DIR$/vendor/symfony/type-info" />
<path value="$PROJECT_DIR$/vendor/symfony/translation" />
<path value="$PROJECT_DIR$/vendor/symfony/framework-bundle" />
<path value="$PROJECT_DIR$/vendor/symfony/http-foundation" />
<path value="$PROJECT_DIR$/vendor/symfony/dom-crawler" />
<path value="$PROJECT_DIR$/vendor/symfony/translation-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/web-profiler-bundle" />
<path value="$PROJECT_DIR$/vendor/sebastian/recursion-context" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-idn" />
<path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
<path value="$PROJECT_DIR$/vendor/symfony/console" />
<path value="$PROJECT_DIR$/vendor/sebastian/environment" />
<path value="$PROJECT_DIR$/vendor/sebastian/global-state" />
<path value="$PROJECT_DIR$/vendor/symfony/error-handler" />
<path value="$PROJECT_DIR$/vendor/sebastian/exporter" />
<path value="$PROJECT_DIR$/vendor/twig/extra-bundle" />
<path value="$PROJECT_DIR$/vendor/symfony/debug-bundle" />
<path value="$PROJECT_DIR$/vendor/sebastian/comparator" />
<path value="$PROJECT_DIR$/vendor/symfony/twig-bundle" />
<path value="$PROJECT_DIR$/vendor/sebastian/version" />
<path value="$PROJECT_DIR$/vendor/symfony/filesystem" />
<path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
<path value="$PROJECT_DIR$/vendor/symfony/security-http" />
<path value="$PROJECT_DIR$/vendor/sebastian/diff" />
<path value="$PROJECT_DIR$/vendor/symfony/config" />
<path value="$PROJECT_DIR$/vendor/sebastian/type" />
<path value="$PROJECT_DIR$/vendor/twig/twig" />
<path value="$PROJECT_DIR$/vendor/symfony/mime" />
<path value="$PROJECT_DIR$/vendor/sebastian/object-enumerator" />
<path value="$PROJECT_DIR$/vendor/symfony/mailer" />
<path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer" />
<path value="$PROJECT_DIR$/vendor/symfony/monolog-bridge" />
<path value="$PROJECT_DIR$/vendor/symfony/dependency-injection" />
<path value="$PROJECT_DIR$/vendor/doctrine/inflector" />
<path value="$PROJECT_DIR$/vendor/symfony/dotenv" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" />
<path value="$PROJECT_DIR$/vendor/symfony/cache-contracts" />
<path value="$PROJECT_DIR$/vendor/symfony/process" />
<path value="$PROJECT_DIR$/vendor/symfony/serializer" />
<path value="$PROJECT_DIR$/vendor/symfony/twig-bridge" />
<path value="$PROJECT_DIR$/vendor/symfony/asset" />
<path value="$PROJECT_DIR$/vendor/symfony/yaml" />
<path value="$PROJECT_DIR$/vendor/symfony/ux-turbo" />
<path value="$PROJECT_DIR$/vendor/symfony/notifier" />
<path value="$PROJECT_DIR$/vendor/symfony/string" />
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-icu" />
<path value="$PROJECT_DIR$/vendor/symfony/http-kernel" />
<path value="$PROJECT_DIR$/vendor/symfony/maker-bundle" />
<path value="$PROJECT_DIR$/vendor/sebastian/object-reflector" />
<path value="$PROJECT_DIR$/vendor/symfony/browser-kit" />
<path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
<path value="$PROJECT_DIR$/vendor/myclabs/deep-copy" />
<path value="$PROJECT_DIR$/vendor/phpunit/php-code-coverage" />
<path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
<path value="$PROJECT_DIR$/vendor/phpunit/phpunit" />
<path value="$PROJECT_DIR$/vendor/phpunit/php-file-iterator" />
<path value="$PROJECT_DIR$/vendor/phpunit/php-text-template" />
<path value="$PROJECT_DIR$/vendor/phpunit/php-timer" />
<path value="$PROJECT_DIR$/vendor/egulias/email-validator" />
<path value="$PROJECT_DIR$/vendor/staabm/side-effects-detector" />
<path value="$PROJECT_DIR$/vendor/phar-io/manifest" />
<path value="$PROJECT_DIR$/vendor/phar-io/version" />
<path value="$PROJECT_DIR$/vendor/symfonycasts/tailwind-bundle" />
<path value="$PROJECT_DIR$/vendor/symfony/ux-twig-component" />
<path value="$PROJECT_DIR$/vendor/symfony/ux-icons" />
<path value="$PROJECT_DIR$/vendor/psr/simple-cache" />
<path value="$PROJECT_DIR$/vendor/twig/string-extra" />
<path value="$PROJECT_DIR$/vendor/knplabs/knp-menu-bundle" />
<path value="$PROJECT_DIR$/vendor/knplabs/knp-menu" />
<path value="$PROJECT_DIR$/vendor/tales-from-a-dev/tailwind-merge-php" />
<path value="$PROJECT_DIR$/vendor/tales-from-a-dev/twig-tailwind-extra" />
<path value="$PROJECT_DIR$/vendor/symfony/doctrine-messenger" />
<path value="$PROJECT_DIR$/vendor/doctrine/doctrine-migrations-bundle" />
<path value="$PROJECT_DIR$/vendor/symfony/doctrine-bridge" />
<path value="$PROJECT_DIR$/vendor/doctrine/migrations" />
<path value="$PROJECT_DIR$/vendor/symfony/messenger" />
<path value="$PROJECT_DIR$/vendor/doctrine/collections" />
<path value="$PROJECT_DIR$/vendor/doctrine/doctrine-bundle" />
<path value="$PROJECT_DIR$/vendor/doctrine/sql-formatter" />
<path value="$PROJECT_DIR$/vendor/doctrine/persistence" />
<path value="$PROJECT_DIR$/vendor/doctrine/instantiator" />
<path value="$PROJECT_DIR$/vendor/doctrine/event-manager" />
<path value="$PROJECT_DIR$/vendor/doctrine/orm" />
<path value="$PROJECT_DIR$/vendor/doctrine/dbal" />
</include_path>
</component>
<component name="PhpInterpreters">
<interpreters>
<interpreter id="0dd689ef-07bf-4cdb-ae62-248f6e72126a" name="ukhorsecremations.co.uk" home="docker-compose://DATA" auto="false" debugger_id="php.debugger.XDebug">
<remote_data INTERPRETER_PATH="php8.4" HELPERS_PATH="/opt/.phpstorm_helpers" VALID="true" RUN_AS_ROOT_VIA_SUDO="false" DOCKER_ACCOUNT_NAME="Docker" DOCKER_COMPOSE_SERVICE_NAME="web" DOCKER_REMOTE_PROJECT_PATH="/opt/project">
<PathMappingSettings>
<option name="pathMappings">
<list>
<mapping local-root="$PROJECT_DIR$/.ddev" remote-root="/mnt/ddev_config" />
<mapping local-root="$PROJECT_DIR$/.git" remote-root="/var/www/html/.git" />
<mapping local-root="$APPLICATION_CONFIG_DIR$/scratches" remote-root="/opt/scratches" />
</list>
</option>
</PathMappingSettings>
<type_data command="EXEC" />
<dockerComposeConfigurationPaths>
<item value="$PROJECT_DIR$/.ddev/.ddev-docker-compose-full.yaml" />
</dockerComposeConfigurationPaths>
<envs>
<env name="COMPOSE_PROJECT_NAME" value="ddev-ukhorsecremationscouk" />
</envs>
</remote_data>
</interpreter>
</interpreters>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.4" />
<component name="PhpStan">
<PhpStan_settings>
<phpstan_by_interpreter asDefaultInterpreter="true" interpreter_id="c9381756-41ec-4dee-a9d4-5e84e9eed8d8" timeout="60000" />
</PhpStan_settings>
</component>
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PhpUnit">
<phpunit_settings>
<PhpUnitSettings custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" />
</phpunit_settings>
</component>
<component name="Psalm">
<Psalm_settings>
<psalm_fixer_by_interpreter asDefaultInterpreter="true" interpreter_id="c9381756-41ec-4dee-a9d4-5e84e9eed8d8" timeout="60000" />
</Psalm_settings>
</component>
<component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" />
</component>
</project>

16
.idea/remote-mappings.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteMappingsManager">
<list>
<list>
<remote-mappings server-id="php@0dd689ef-07bf-4cdb-ae62-248f6e72126a">
<settings>
<list>
<mapping local-root="$PROJECT_DIR$" remote-root="/var/www/html" />
</list>
</settings>
</remote-mappings>
</list>
</list>
</component>
</project>

View File

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="App\" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" packagePrefix="App\Tests\" />
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/collections" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/dbal" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/deprecations" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/doctrine-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/doctrine-migrations-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/event-manager" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/inflector" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/instantiator" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/lexer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/migrations" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/orm" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/persistence" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/sql-formatter" />
<excludeFolder url="file://$MODULE_DIR$/vendor/egulias/email-validator" />
<excludeFolder url="file://$MODULE_DIR$/vendor/knplabs/knp-menu" />
<excludeFolder url="file://$MODULE_DIR$/vendor/knplabs/knp-menu-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" />
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
<excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/manifest" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/version" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/type-resolver" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpstan/phpdoc-parser" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-file-iterator" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-invoker" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/cache" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/clock" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/container" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/event-dispatcher" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/link" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/log" />
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/simple-cache" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/cli-parser" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/comparator" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/complexity" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/diff" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/environment" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/exporter" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/global-state" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/lines-of-code" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-enumerator" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-reflector" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/recursion-context" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/type" />
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/version" />
<excludeFolder url="file://$MODULE_DIR$/vendor/staabm/side-effects-detector" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/asset" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/asset-mapper" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/browser-kit" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/cache" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/cache-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/clock" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/config" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/console" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/css-selector" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/debug-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dependency-injection" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/deprecation-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/doctrine-bridge" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/doctrine-messenger" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dom-crawler" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dotenv" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/error-handler" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/expression-language" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/filesystem" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/finder" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/flex" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/form" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/framework-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-client" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-client-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-kernel" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/intl" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/mailer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/maker-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/messenger" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/mime" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/monolog-bridge" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/monolog-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/notifier" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/options-resolver" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/password-hasher" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-grapheme" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-icu" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-idn" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-intl-normalizer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-mbstring" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php85" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/process" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/property-access" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/property-info" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/routing" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/runtime" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-core" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-csrf" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/security-http" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/serializer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/service-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/stimulus-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/stopwatch" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/string" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/translation" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/translation-contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/twig-bridge" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/twig-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/type-info" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/ux-icons" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/ux-turbo" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/ux-twig-component" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/validator" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/var-dumper" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/var-exporter" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/web-link" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/web-profiler-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/yaml" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfonycasts/tailwind-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/tales-from-a-dev/tailwind-merge-php" />
<excludeFolder url="file://$MODULE_DIR$/vendor/tales-from-a-dev/twig-tailwind-extra" />
<excludeFolder url="file://$MODULE_DIR$/vendor/theseer/tokenizer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/twig/extra-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/twig/string-extra" />
<excludeFolder url="file://$MODULE_DIR$/vendor/twig/twig" />
<excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/assert" />
<excludeFolder url="file://$MODULE_DIR$/var/cache" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -1,10 +1,2 @@
import './stimulus_bootstrap.js'; import './stimulus_bootstrap.js';
/*
* Welcome to your app's main JavaScript file!
*
* This file will be included onto the page via the importmap() Twig function,
* which should already be in your base.html.twig.
*/
import './styles/app.css'; import './styles/app.css';
console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');

View File

@ -0,0 +1,22 @@
import { Controller } from "@hotwired/stimulus"
import { useTransition } from "stimulus-use"
export default class Drawer extends Controller {
static targets = ["draw"]
connect() {
useTransition(this, {
element: this.drawTarget,
})
}
toggle() {
this.toggleTransition()
}
hide(event) {
if (!this.element.contains(event.target) && !this.menuTarget.classList.contains("hidden")) {
this.leave()
}
}
}

View File

@ -0,0 +1,22 @@
import { Controller } from "@hotwired/stimulus"
import { useTransition } from "stimulus-use"
export default class Dropdown extends Controller {
static targets = ["menu"]
connect() {
useTransition(this, {
element: this.drawTarget,
})
}
toggle() {
this.toggleTransition()
}
hide(event) {
if (!this.element.contains(event.target) && !this.drawTarget.classList.contains("hidden")) {
this.leave()
}
}
}

BIN
assets/images/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
assets/images/hero/home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
assets/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,3 +1,10 @@
body { @import "tailwindcss";
background-color: skyblue; @import "tw-animate-css";
@plugin "@tailwindcss/typography";
@config "./tailwind.config.js";
@theme {
--color-primary: #00A489;
--color-secondary: #4D4A49;
} }

View File

@ -0,0 +1,19 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
theme: {
extend: {
typography: {
DEFAULT: {
css: {
fontSize: '1.125rem',
lineHeight: '1.5rem',
color: 'var(--color-secondary)',
a: {
color: 'var(--color-primary)',
},
},
},
},
},
},
}

View File

@ -7,25 +7,26 @@
"php": ">=8.4", "php": ">=8.4",
"ext-ctype": "*", "ext-ctype": "*",
"ext-iconv": "*", "ext-iconv": "*",
"doctrine/doctrine-bundle": "^3.2", "doctrine/doctrine-bundle": "^3.2.2",
"doctrine/doctrine-migrations-bundle": "^4.0", "doctrine/doctrine-migrations-bundle": "^4.0",
"doctrine/orm": "^3.6", "doctrine/orm": "^3.6.2",
"phpdocumentor/reflection-docblock": "^6.0", "knplabs/knp-menu-bundle": "^3.7",
"phpstan/phpdoc-parser": "^2.3", "phpdocumentor/reflection-docblock": "^6.0.1",
"phpstan/phpdoc-parser": "^2.3.2",
"symfony/asset": "8.0.*", "symfony/asset": "8.0.*",
"symfony/asset-mapper": "8.0.*", "symfony/asset-mapper": "8.0.*",
"symfony/console": "8.0.*", "symfony/console": "8.0.*",
"symfony/doctrine-messenger": "8.0.*", "symfony/doctrine-messenger": "8.0.*",
"symfony/dotenv": "8.0.*", "symfony/dotenv": "8.0.*",
"symfony/expression-language": "8.0.*", "symfony/expression-language": "8.0.*",
"symfony/flex": "^2", "symfony/flex": "^2.10",
"symfony/form": "8.0.*", "symfony/form": "8.0.*",
"symfony/framework-bundle": "8.0.*", "symfony/framework-bundle": "8.0.*",
"symfony/http-client": "8.0.*", "symfony/http-client": "8.0.*",
"symfony/intl": "8.0.*", "symfony/intl": "8.0.*",
"symfony/mailer": "8.0.*", "symfony/mailer": "8.0.*",
"symfony/mime": "8.0.*", "symfony/mime": "8.0.*",
"symfony/monolog-bundle": "^3.0|^4.0", "symfony/monolog-bundle": "^3.0|^4.0.1",
"symfony/notifier": "8.0.*", "symfony/notifier": "8.0.*",
"symfony/process": "8.0.*", "symfony/process": "8.0.*",
"symfony/property-access": "8.0.*", "symfony/property-access": "8.0.*",
@ -37,12 +38,17 @@
"symfony/string": "8.0.*", "symfony/string": "8.0.*",
"symfony/translation": "8.0.*", "symfony/translation": "8.0.*",
"symfony/twig-bundle": "8.0.*", "symfony/twig-bundle": "8.0.*",
"symfony/ux-icons": "^2.32",
"symfony/ux-turbo": "^2.32", "symfony/ux-turbo": "^2.32",
"symfony/ux-twig-component": "^2.32",
"symfony/validator": "8.0.*", "symfony/validator": "8.0.*",
"symfony/web-link": "8.0.*", "symfony/web-link": "8.0.*",
"symfony/yaml": "8.0.*", "symfony/yaml": "8.0.*",
"twig/extra-bundle": "^2.12|^3.0", "symfonycasts/tailwind-bundle": "^0.12.0",
"twig/twig": "^2.12|^3.0" "tales-from-a-dev/twig-tailwind-extra": "^1.1",
"twig/extra-bundle": "^3.23",
"twig/string-extra": "^3.23",
"twig/twig": "^2.12|^3.23"
}, },
"config": { "config": {
"allow-plugins": { "allow-plugins": {
@ -98,11 +104,11 @@
} }
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^13.0", "phpunit/phpunit": "^13.0.5",
"symfony/browser-kit": "8.0.*", "symfony/browser-kit": "8.0.*",
"symfony/css-selector": "8.0.*", "symfony/css-selector": "8.0.*",
"symfony/debug-bundle": "8.0.*", "symfony/debug-bundle": "8.0.*",
"symfony/maker-bundle": "^1.0", "symfony/maker-bundle": "^1.66",
"symfony/stopwatch": "8.0.*", "symfony/stopwatch": "8.0.*",
"symfony/web-profiler-bundle": "8.0.*" "symfony/web-profiler-bundle": "8.0.*"
} }

5044
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -13,4 +13,9 @@ return [
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
Symfony\UX\Icons\UXIconsBundle::class => ['all' => true],
Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
Symfonycasts\TailwindBundle\SymfonycastsTailwindBundle::class => ['all' => true],
TalesFromADev\Twig\Extra\Tailwind\Bridge\Symfony\Bundle\TalesFromADevTwigExtraTailwindBundle::class => ['all' => true],
]; ];

View File

@ -0,0 +1,6 @@
symfonycasts_tailwind:
# Specify the EXACT version of Tailwind CSS you want to use
binary_version: 'v4.1.11'
# Alternatively, you can specify the path to the binary that you manage yourself
#binary: 'node_modules/.bin/tailwindcss'

View File

@ -0,0 +1,5 @@
twig_component:
anonymous_template_directory: 'components/'
defaults:
# Namespace & directory for components
App\Twig\Components\: 'components/'

View File

@ -0,0 +1,20 @@
# Full configuration reference: https://symfony.com/bundles/ux-icons/current/index.html#configuration
ux_icons:
# Default HTML attributes to add to all icons
default_icon_attributes:
# Use current text color to fill the icon
fill: currentColor
# Default dimensions
height: '1em'
width: '1em'
# Throw an exception if an icon is not
ignore_not_found: false
when@prod:
ux_icons:
# Suppress exceptions for missing icons in production
ignore_not_found: true

View File

@ -1,6 +1,6 @@
when@dev: when@dev:
web_profiler: web_profiler:
toolbar: true toolbar: false
framework: framework:
profiler: profiler:

View File

@ -972,7 +972,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* enabled?: bool|Param, // Default: false * enabled?: bool|Param, // Default: false
* }, * },
* string?: bool|array{ * string?: bool|array{
* enabled?: bool|Param, // Default: false * enabled?: bool|Param, // Default: true
* }, * },
* commonmark?: array{ * commonmark?: array{
* renderer?: array{ // Array of options for rendering HTML. * renderer?: array{ // Array of options for rendering HTML.
@ -1455,6 +1455,58 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* generate_final_classes?: bool|Param, // Default: true * generate_final_classes?: bool|Param, // Default: true
* generate_final_entities?: bool|Param, // Default: false * generate_final_entities?: bool|Param, // Default: false
* } * }
* @psalm-type KnpMenuConfig = array{
* providers?: array{
* builder_alias?: bool|Param, // Default: true
* },
* twig?: array{
* template?: scalar|Param|null, // Default: "@KnpMenu/menu.html.twig"
* },
* templating?: bool|Param, // Default: false
* default_renderer?: scalar|Param|null, // Default: "twig"
* }
* @psalm-type UxIconsConfig = array{
* icon_dir?: scalar|Param|null, // The local directory where icons are stored. // Default: "%kernel.project_dir%/assets/icons"
* default_icon_attributes?: array<string, scalar|Param|null>,
* icon_sets?: array<string, array{ // the icon set prefix (e.g. "acme") // Default: []
* path?: scalar|Param|null, // The local icon set directory path. (cannot be used with 'alias')
* alias?: scalar|Param|null, // The remote icon set identifier. (cannot be used with 'path')
* icon_attributes?: array<string, scalar|Param|null>,
* }>,
* aliases?: array<string, string|Param>,
* iconify?: bool|array{ // Configuration for the remote icon service.
* enabled?: bool|Param, // Default: true
* on_demand?: bool|Param, // Whether to download icons "on demand". // Default: true
* endpoint?: scalar|Param|null, // The endpoint for the Iconify icons API. // Default: "https://api.iconify.design"
* },
* ignore_not_found?: bool|Param, // Ignore error when an icon is not found. Set to 'true' to fail silently. // Default: false
* }
* @psalm-type TwigComponentConfig = array{
* defaults?: array<string, string|array{ // Default: ["__deprecated__use_old_naming_behavior"]
* template_directory?: scalar|Param|null, // Default: "components"
* name_prefix?: scalar|Param|null, // Default: ""
* }>,
* anonymous_template_directory?: scalar|Param|null, // Defaults to `components`
* profiler?: bool|array{ // Enables the profiler for Twig Component
* enabled?: bool|Param, // Default: "%kernel.debug%"
* collect_components?: bool|Param, // Collect components instances // Default: true
* },
* controllers_json?: scalar|Param|null, // Deprecated: The "twig_component.controllers_json" config option is deprecated, and will be removed in 3.0. // Default: null
* }
* @psalm-type SymfonycastsTailwindConfig = array{
* input_css?: list<scalar|Param|null>,
* config_file?: scalar|Param|null, // Path to the tailwind.config.js file // Default: "%kernel.project_dir%/tailwind.config.js"
* binary?: scalar|Param|null, // The tailwind binary to use instead of downloading a new one // Default: null
* binary_version?: scalar|Param|null, // Tailwind CLI version to download - null means the latest version // Default: null
* binary_platform?: "auto"|"linux-arm64"|"linux-arm64-musl"|"linux-x64"|"linux-x64-musl"|"macos-arm64"|"macos-x64"|"windows-x64"|Param, // Tailwind CLI platform to download - "auto" will try to detect the platform automatically // Default: "auto"
* postcss_config_file?: scalar|Param|null, // Path to PostCSS config file which is passed to the Tailwind CLI // Default: null
* strict_mode?: bool|Param|null, // When enabled, an exception will be thrown if there are no built assets (default: false in `test` env, true otherwise) // Default: null
* }
* @psalm-type TalesFromADevTwigExtraTailwindConfig = array{
* tailwind_merge?: array{
* additional_configuration?: mixed, // Default: []
* },
* }
* @psalm-type ConfigType = array{ * @psalm-type ConfigType = array{
* imports?: ImportsConfig, * imports?: ImportsConfig,
* parameters?: ParametersConfig, * parameters?: ParametersConfig,
@ -1468,6 +1520,11 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* twig_extra?: TwigExtraConfig, * twig_extra?: TwigExtraConfig,
* security?: SecurityConfig, * security?: SecurityConfig,
* monolog?: MonologConfig, * monolog?: MonologConfig,
* knp_menu?: KnpMenuConfig,
* ux_icons?: UxIconsConfig,
* twig_component?: TwigComponentConfig,
* symfonycasts_tailwind?: SymfonycastsTailwindConfig,
* tales_from_a_dev_twig_extra_tailwind?: TalesFromADevTwigExtraTailwindConfig,
* "when@dev"?: array{ * "when@dev"?: array{
* imports?: ImportsConfig, * imports?: ImportsConfig,
* parameters?: ParametersConfig, * parameters?: ParametersConfig,
@ -1484,6 +1541,11 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* security?: SecurityConfig, * security?: SecurityConfig,
* monolog?: MonologConfig, * monolog?: MonologConfig,
* maker?: MakerConfig, * maker?: MakerConfig,
* knp_menu?: KnpMenuConfig,
* ux_icons?: UxIconsConfig,
* twig_component?: TwigComponentConfig,
* symfonycasts_tailwind?: SymfonycastsTailwindConfig,
* tales_from_a_dev_twig_extra_tailwind?: TalesFromADevTwigExtraTailwindConfig,
* }, * },
* "when@prod"?: array{ * "when@prod"?: array{
* imports?: ImportsConfig, * imports?: ImportsConfig,
@ -1498,6 +1560,11 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* twig_extra?: TwigExtraConfig, * twig_extra?: TwigExtraConfig,
* security?: SecurityConfig, * security?: SecurityConfig,
* monolog?: MonologConfig, * monolog?: MonologConfig,
* knp_menu?: KnpMenuConfig,
* ux_icons?: UxIconsConfig,
* twig_component?: TwigComponentConfig,
* symfonycasts_tailwind?: SymfonycastsTailwindConfig,
* tales_from_a_dev_twig_extra_tailwind?: TalesFromADevTwigExtraTailwindConfig,
* }, * },
* "when@test"?: array{ * "when@test"?: array{
* imports?: ImportsConfig, * imports?: ImportsConfig,
@ -1513,6 +1580,11 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* twig_extra?: TwigExtraConfig, * twig_extra?: TwigExtraConfig,
* security?: SecurityConfig, * security?: SecurityConfig,
* monolog?: MonologConfig, * monolog?: MonologConfig,
* knp_menu?: KnpMenuConfig,
* ux_icons?: UxIconsConfig,
* twig_component?: TwigComponentConfig,
* symfonycasts_tailwind?: SymfonycastsTailwindConfig,
* tales_from_a_dev_twig_extra_tailwind?: TalesFromADevTwigExtraTailwindConfig,
* }, * },
* ...<string, ExtensionType|array{ // extra keys must follow the when@%env% pattern or match an extension alias * ...<string, ExtensionType|array{ // extra keys must follow the when@%env% pattern or match an extension alias
* imports?: ImportsConfig, * imports?: ImportsConfig,

17
docker-compose.yaml Normal file
View File

@ -0,0 +1,17 @@
services:
ukhorsecremations.co.uk-web:
container_name: ukhorsecremations.co.uk-web
build: .
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.docker.network=proxy
- traefik.http.routers.ukhorsecremations-co-uk.rule=Host(`ukhorsecremations-co-uk.web1.phatkoala.net`)
- traefik.http.services.ukhorsecremations-co-uk.loadbalancer.server.port=3000
- traefik.http.routers.ukhorsecremations-co-uk.middlewares=basic-auth@file
networks:
- proxy
networks:
proxy:
external: true

View File

@ -25,4 +25,7 @@ return [
'@hotwired/turbo' => [ '@hotwired/turbo' => [
'version' => '7.3.0', 'version' => '7.3.0',
], ],
'stimulus-use' => [
'version' => '0.52.3',
],
]; ];

58
package-lock.json generated Normal file
View File

@ -0,0 +1,58 @@
{
"name": "ukhorsecremations.co.uk",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ukhorsecremations.co.uk",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"stimulus-use": "^0.52.3"
}
},
"node_modules/@hotwired/stimulus": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz",
"integrity": "sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==",
"dev": true,
"license": "MIT",
"peer": true
},
"node_modules/hotkeys-js": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-4.0.4.tgz",
"integrity": "sha512-hseNiqaskxSnujuGp8aRMLJfcjaFiTSS0I2GQhqru82N/sx6CGyUf6pvU5X1iycvw2EqmvILkFIb5OzYFXY+9A==",
"dev": true,
"license": "MIT",
"peer": true,
"funding": {
"url": "https://jaywcjlove.github.io/#/sponsor"
}
},
"node_modules/stimulus-use": {
"version": "0.52.3",
"resolved": "https://registry.npmjs.org/stimulus-use/-/stimulus-use-0.52.3.tgz",
"integrity": "sha512-stZ5dID6FUrGCR/ChWUa0FT5Z8iqkzT6lputOAb50eF+Ayg7RzJj4U/HoRlp2NV333QfvoRidru9HLbom4hZVw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"@hotwired/stimulus": ">= 3",
"hotkeys-js": ">= 3"
}
},
"node_modules/tw-animate-css": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz",
"integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Wombosvideo"
}
}
}
}

13
package.json Normal file
View File

@ -0,0 +1,13 @@
{
"name": "ukhorsecremations.co.uk",
"version": "1.0.0",
"main": "index.js",
"author": "Stewart Walter <swalter@strategies.co.uk>",
"license": "MIT",
"devDependencies": {
"stimulus-use": "^0.52.3"
},
"dependencies": {
"tw-animate-css": "^1.4.0"
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class AboutController extends AbstractController
{
#[Route('/about', name: 'about')]
public function index(): Response
{
return $this->render('about.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class ContactController extends AbstractController
{
#[Route('/contact', name: 'contact')]
public function index(): Response
{
return $this->render('contact.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class HomeController extends AbstractController
{
#[Route('/', name: 'home')]
public function index(): Response
{
return $this->render('home.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class KeepsakesController extends AbstractController
{
#[Route('/keepsakes', name: 'keepsakes')]
public function index(): Response
{
return $this->render('keepsakes.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class PoliciesController extends AbstractController
{
#[Route('/policies', name: 'policies')]
public function index(): Response
{
return $this->render('policies.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class ReviewsController extends AbstractController
{
#[Route('/reviews', name: 'reviews')]
public function index(): Response
{
return $this->render('reviews.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class ServicesController extends AbstractController
{
#[Route('/services', name: 'services')]
public function index(): Response
{
return $this->render('services.html.twig');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class SitemapController extends AbstractController
{
#[Route('/sitemap', name: 'sitemap')]
public function index(): Response
{
return $this->render('sitemap.html.twig');
}
}

View File

@ -0,0 +1,26 @@
<?php
declare(strict_types=1);
namespace App\Twig;
use Twig\Attribute\AsTwigFilter;
use Twig\Markup;
final class HighlightCapsExtension
{
#[AsTwigFilter('highlight_caps')]
public function highlightCaps(string $text, string $class = 'text-primary'): Markup
{
$escapedText = htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$escapedClass = htmlspecialchars($class, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$html = preg_replace(
'/([A-Z])/',
'<span class="' . $escapedClass . '">$1</span>',
$escapedText
);
return new Markup($html ?? $escapedText, 'UTF-8');
}
}

View File

@ -35,6 +35,9 @@
"migrations/.gitignore" "migrations/.gitignore"
] ]
}, },
"knplabs/knp-menu-bundle": {
"version": "v3.7.0"
},
"phpunit/phpunit": { "phpunit/phpunit": {
"version": "13.0", "version": "13.0",
"recipe": { "recipe": {
@ -270,6 +273,19 @@
"templates/base.html.twig" "templates/base.html.twig"
] ]
}, },
"symfony/ux-icons": {
"version": "2.32",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "2.19",
"ref": "c965ca0bf8a40e03420d57e08cff0bf6045e4ae7"
},
"files": [
"assets/icons/symfony.svg",
"config/packages/ux_icons.yaml"
]
},
"symfony/ux-turbo": { "symfony/ux-turbo": {
"version": "2.32", "version": "2.32",
"recipe": { "recipe": {
@ -282,6 +298,18 @@
"config/packages/ux_turbo.yaml" "config/packages/ux_turbo.yaml"
] ]
}, },
"symfony/ux-twig-component": {
"version": "2.32",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "2.13",
"ref": "f367ae2a1faf01c503de2171f1ec22567febeead"
},
"files": [
"config/packages/twig_component.yaml"
]
},
"symfony/validator": { "symfony/validator": {
"version": "8.0", "version": "8.0",
"recipe": { "recipe": {
@ -319,6 +347,27 @@
"config/packages/messenger.yaml" "config/packages/messenger.yaml"
] ]
}, },
"symfonycasts/tailwind-bundle": {
"version": "0.12",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "0.8",
"ref": "d0bd0276f74de90adfaa4c6cd74cc0caacd77e0a"
},
"files": [
"config/packages/symfonycasts_tailwind.yaml"
]
},
"tales-from-a-dev/twig-tailwind-extra": {
"version": "1.1",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "0.2",
"ref": "7243ab070ed66198eb82c026684e9b9773e7b64a"
}
},
"twig/extra-bundle": { "twig/extra-bundle": {
"version": "v3.23.0" "version": "v3.23.0"
} }

13
templates/about.html.twig Normal file
View File

@ -0,0 +1,13 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremations</twig:H1>
</twig:Hero>
<div class="mx-auto max-w-7xl">
</div>
{% endblock %}

View File

@ -1,9 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title> <title>{% block title %}Welcome!{% endblock %}</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>"> <link rel="icon" href="{{ asset('images/favicon.png') }}">
{% block stylesheets %} {% block stylesheets %}
{% endblock %} {% endblock %}
@ -11,7 +11,82 @@
{% block importmap %}{{ importmap('app') }}{% endblock %} {% block importmap %}{{ importmap('app') }}{% endblock %}
{% endblock %} {% endblock %}
</head> </head>
<body> <body class="text-secondary">
{% block body %}{% endblock %} <header class="bg-secondary fixed top-0 z-30 w-full">
<img src="{{ asset('images/img.png') }}" alt="" class="w-[238px] h-auto" />
<nav aria-label="Global" class="mx-auto flex max-w-7xl items-center justify-between p-6 lg:px-8">
<div class="flex flex-1">
</div>
<a href="#" class="-m-1.5 p-1.5">
<span class="sr-only">Your Company</span>
<img src="{{ asset('images/logo.png') }}" alt="" class="w-[238px] h-auto" />
</a>
<div class="flex flex-1 justify-end">
<a href="tel:07834373058" class="text-3xl text-white font-serif">T: 07834 373 058</a>
</div>
</nav>
</header>
<main class="border-t-20 border-primary mt-45">
{% block body %}{% endblock %}
</main>
<div {{ stimulus_controller('drawer') }}>
<div class="fixed top-0 left-0 z-40 h-screen p-4 overflow-y-auto transition-transform bg-primary w-96" {{ stimulus_target('drawer', 'draw') }}
data-transition-enter-from="-translate-x-full"
data-transition-enter-to="transform-none"
data-transition-leave-from="transform-none"
data-transition-leave-to="-translate-x-full"
>
<div tabindex="0" class="fixed inset-0 focus:outline-none">
<div class="flex flex-col mt-60 px-12 space-y-6">
<a href="{{ path('home') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">Home</a>
<a href="{{ path('services') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">Services</a>
<a href="{{ path('keepsakes') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">Keepsakes</a>
<a href="{{ path('about') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">About</a>
<a href="{{ path('reviews') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">Reviews</a>
<a href="{{ path('policies') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">Policies</a>
<a href="{{ path('sitemap') }}" class="text-3xl text-white font-serif hover:text-black hover:underline">Sitemap</a>
</div>
</div>
</div>
<div class="fixed top-17 left-10 z-50">
<button type="button" class="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-white hover:text-white" {{ stimulus_action('drawer', 'toggle') }}>
<span class="sr-only">Open main menu</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" data-slot="icon" aria-hidden="true" class="size-12">
<path d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</button>
</div>
</div>
<footer class="bg-primary w-full">
<div class="w-full bg-secondary h-8 shadow-xl"></div>
<twig:Container>
<twig:Cols class="text-xl text-white font-serif text-center p-12 mb-0">
<twig:Col>
<div class="flex flex-col gap-y-4 text-center">
<a href="{{ path('policies') }}">Website Disclaimer</a>
<a href="{{ path('policies') }}">Privacy &amp; Cookies</a>
<a href="{{ path('sitemap') }}">Sitemap</a>
</div>
</twig:Col>
<twig:Col>
<div class="flex flex-row gap-x-6 justify-center">
<a href="https://www.facebook.com">{{ ux_icon('bi:facebook', {class: 'size-10'}) }}</a>
<a href="https://wa.me/447834373058">{{ ux_icon('bi:whatsapp', {class: 'size-10 text-white'}) }}</a>
</div>
</twig:Col>
<twig:Col>
<div class="flex flex-col gap-y-4">
<div>&copy; {{ "now"|date('Y') }} All Rights Reserved </div>
<a>UK Horse Cremations</a>
<a>Website Disclaimer</a>
</div>
</twig:Col>
</twig:Cols>
</twig:Container>
</footer>
</body> </body>
</html> </html>

View File

@ -0,0 +1,3 @@
<div class="{{ ("flex-1 " ~ class ?? null)|tailwind_merge }}">
{% block content %}{% endblock content %}
</div>

View File

@ -0,0 +1,3 @@
<div class="{{ ("flex gap-x-4 mb-18 " ~ class ?? null)|tailwind_merge }}">
{% block content %}{% endblock content %}
</div>

View File

@ -0,0 +1 @@
<div class="{{ ("mx-auto max-w-7xl" ~ class ?? null)|tailwind_merge }}">{% block content %}{% endblock content %}</div>

View File

@ -0,0 +1 @@
<h1 class="text-white text-7xl font-serif animate-in zoom-in duration-600">{% block content %}{% endblock content %}</h1>

View File

@ -0,0 +1 @@
<h1 class="text-secondary text-3xl font-serif animate-in zoom-in duration-600 text-center mb-6">{% block content %}{% endblock content %}</h1>

View File

@ -0,0 +1,7 @@
<div class="relative isolate overflow-hidden h-[535px] mb-12">
<img src="{{ image }}" alt="" class="absolute inset-0 -z-20 size-full object-cover" />
<div class="flex flex-col h-full justify-center items-center mx-auto max-w-5xl p-12 gap-y-12">
{% block content %}{% endblock content %}
</div>
<div aria-hidden="true" class="absolute inset-0 blur-3xl bg-black/40 -z-10"></div>
</div>

View File

@ -0,0 +1 @@
<img class="mx-auto border-2 border-primary shadow-md" {{ attributes }} />

View File

@ -0,0 +1 @@
<div class="text-2xl text-white text-center font-serif italic">{% block content %}{% endblock content %}</div>

View File

@ -0,0 +1 @@
<div class="prose">{% block content %}{% endblock content %}</div>

79
templates/home.html.twig Normal file
View File

@ -0,0 +1,79 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremations</twig:H1>
</twig:Hero>
<twig:Container>
<twig:H2>{{ "Compassionate & Caring Horse Cremation Services"|highlight_caps }}</twig:H2>
<twig:Cols>
<twig:Col>
<twig:Image src="{{ asset('images/horse-stallion.png') }}" alt="Horse Cremations" class="mx-auto" />
</twig:Col>
<twig:Col>
<twig:Prose>
<p>UK Horse Cremations offers sensitive, compassionate and caring cremation services, if sadly your horse or pony is deceased.</p>
<p>Choose your equine cremation service level from:-</p>
<ul>
<li>Collection Only</li>
<li>Cremation &amp; Token</li>
<li>Cremation Plus</li>
</ul>
<p>More about <a href="{{ path('services') }}">Horse Cremation</a> service options.</p>
<p>An Equine Dispatch Service is also available.</p>
<p>Serving the Hampshire, Berkshire and Surrey areas.</p>
<p>Call 07834 373058 now available 24/7.</p>
</twig:Prose>
</twig:Col>
</twig:Cols>
<twig:H2>{{ "UK Horse Cremations Customers Say..."|highlight_caps }}</twig:H2>
<twig:Cols>
<twig:Col>
<twig:Prose>
<blockquote>
<p>At such a devastating time you were very calm and supportive and looked after Charlie in a very compassionate manner... Thank you again for making such a terribly sad experience a little bit easier by knowing that you took such good care of my boy, who will never be forgotten.</p>
</blockquote>
<div class="text-primary text-right">Rebecca, S.</div>
<blockquote>
<p>It was with professionalism calmness and empathy that Ed Chapman PTS my faithful friend. All the while showing kindness and swiftness in his actions so my pony was not at any time wary or fearful. I would trust no one else to complete the traumatic process of PTS my faithful companion and arranging her cremation.</p>
</blockquote>
<div class="text-primary text-right mt-0">Kate, W.</div>
<blockquote>
<p>I had to use Ed Chapman&#39;s services for an old gelding of mine. He was very professional and his kindness and patience made a very difficult time easier.</p>
</blockquote>
<div class="text-primary text-right">Julie, P.</div>
</twig:Prose>
</twig:Col>
<twig:Col>
<twig:Image src="{{ asset('images/horse-stallion.png') }}" alt="Horse Cremations" />
</twig:Col>
</twig:Cols>
<twig:H2>{{ "Keepsakes - Caskets, Urns, Custom Jewellery"|highlight_caps }}</twig:H2>
<twig:Cols>
<twig:Col>
<img src="{{ asset('images/horse-stallion.png') }}" alt="Horse Cremations" />
</twig:Col>
<twig:Col>
<twig:Prose>
<p>It goes without saying your horse or pony is special to you.</p>
<p>Following the collection and individual cremation of your horse or pony, the ashes can be returned to you if you wish.</p>
<p>Keepsakes for the return of the ashes include:-</p>
<ul>
<li>Caskets</li>
<li>Urns</li>
<li>Custom Jewellery</li>
<li>Memorial "Gems"</li>
</ul>
<p>Find more about your Keepsakes options.</p>
</twig:Prose>
</twig:Col>
</twig:Cols>
</twig:Container>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremations</twig:H1>
</twig:Hero>
<div class="mx-auto max-w-7xl">
</div>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremations</twig:H1>
</twig:Hero>
<div class="mx-auto max-w-7xl">
</div>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremations</twig:H1>
</twig:Hero>
<div class="mx-auto max-w-7xl">
</div>
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremation Services</twig:H1>
<twig:Lead>
UK Horse Cremations provides a wide range of professional equine cremation services at what can be a difficult time. We promise to provide every service with a smile and to treat you respectfully and sensitively.
</twig:Lead>
</twig:Hero>
<div class="mx-auto max-w-7xl">
</div>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends 'base.html.twig' %}
{% block title %}Hello HomeController!{% endblock %}
{% block body %}
<twig:Hero image="{{ asset('images/hero/home.png') }}">
<twig:H1>Horse Cremations</twig:H1>
</twig:Hero>
<div class="mx-auto max-w-7xl">
</div>
{% endblock %}

23
yarn.lock Normal file
View File

@ -0,0 +1,23 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@hotwired/stimulus@>= 3":
version "3.2.2"
resolved "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz"
integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==
"hotkeys-js@>= 3":
version "4.0.4"
resolved "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-4.0.4.tgz"
integrity sha512-hseNiqaskxSnujuGp8aRMLJfcjaFiTSS0I2GQhqru82N/sx6CGyUf6pvU5X1iycvw2EqmvILkFIb5OzYFXY+9A==
stimulus-use@^0.52.3:
version "0.52.3"
resolved "https://registry.npmjs.org/stimulus-use/-/stimulus-use-0.52.3.tgz"
integrity sha512-stZ5dID6FUrGCR/ChWUa0FT5Z8iqkzT6lputOAb50eF+Ayg7RzJj4U/HoRlp2NV333QfvoRidru9HLbom4hZVw==
tw-animate-css@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz"
integrity sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==