Reset project

This commit is contained in:
2025-05-25 10:14:48 +02:00
parent 542d28e7a9
commit 6e443de84f
197 changed files with 64591 additions and 1027 deletions
.gitignoreDockerfileMakefile
cmd/site
internal/handlers
main.go
web
static
apple-touch-icon.png
css
favicon.svg
img
Bromeliad.jpgRookieStripes.jpgTreeOfLight.jpgaction.jpg
anniversary
cordula.jpgdownloads-bg.jpgfarben.jpg
flags
intro-bg.jpgladen.jpgloading.giflogo-small.pnglogo.pngmap-marker.pngmontage.jpgniggi.jpgoverview.jpgprogressbar.gifwaage.jpgwickeln.jpgwolle.jpg
js
templates

2
.gitignore vendored

@@ -21,3 +21,5 @@
# Go workspace file # Go workspace file
go.work go.work
tmp
web/static/css/.DS_Store

18
Dockerfile Normal file

@@ -0,0 +1,18 @@
FROM golang:1.23 AS builder
WORKDIR /app
COPY go.mod ./
ENV CGO_ENABLED=0
RUN go mod download
COPY . .
RUN go build -o server main.go
# Copy the server binary into a distroless container
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /app/server /
CMD ["/server"]
USER nonroot

@@ -1,18 +1,27 @@
TARGET = ./site .PHONY: dev build
.PHONY: clean distclean test components $(TARGET) dev:
@if command -v $(HOME)/go/bin/air > /dev/null; then \
AIR_CMD="$(HOME)/go/bin/air"; \
elif command -v air > /dev/null; then \
AIR_CMD="air"; \
else \
read -p "air is not installed. Install it? [Y/n] " choice; \
if [ "$$choice" != "n" ] && [ "$$choice" != "N" ]; then \
echo "Installing..."; \
go install github.com/air-verse/air@latest; \
AIR_CMD="$(HOME)/go/bin/air"; \
else \
echo "Exiting..."; \
exit 1; \
fi; \
fi; \
echo "Starting Air..."; \
$$AIR_CMD
.NOTPARALLEL: build:
@echo "Generate Tailwind CSS..."
$(TARGET): components go generate
$(info ===> BUILD site) @echo "Building Go server..."
@go build ./cmd/site go build -o tmp/server main.go
@echo "Build complete."
components:
$(info ===> BUILD templates)
cd web/components && templ generate
clean:
$(info ===> CLEAN)
@go clean
@rm -f $(TARGET)

@@ -1,41 +0,0 @@
package main
import (
"context"
"fmt"
"log/slog"
"os"
"os/signal"
"git.clustercockpit.org/moebiusband/go-http-skeleton/internal/util"
"git.clustercockpit.org/moebiusband/go-http-skeleton/web"
"github.com/joho/godotenv"
)
func main() {
godotenv.Load()
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("Starting http server")
defer logger.Info("Stopping http server")
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
if err := run(ctx); err != nil {
logger.Error("Error running http server", slog.Any("err", err))
os.Exit(1)
}
}
func run(ctx context.Context) error {
eg := util.NewErrGroupSharedCtx(
ctx,
web.RunBlocking(8080),
)
if err := eg.Wait(); err != nil {
return fmt.Errorf("error running http server: %w", err)
}
return nil
}

@@ -14,19 +14,26 @@ type PageData struct {
func RootHandler() http.HandlerFunc { func RootHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
file, err := web.Templates.ReadFile("templates/index.html") slog.Info("Render root handler")
if err != nil { tpl := template.Must(template.ParseFS(web.Templates, "templates/index.html", "templates/base.html"))
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
slog.Error("Error reading template", "error", err)
return
}
tmpl := template.Must(template.New("index.html").Parse(string(file))) // basefile, err := web.Templates.ReadFile("templates/base.html")
// if err != nil {
// http.Error(w, "Internal Server Error", http.StatusInternalServerError)
// slog.Error("Error reading template", "error", err)
// return
// }
// file, err := web.Templates.ReadFile("templates/index.html")
// if err != nil {
// http.Error(w, "Internal Server Error", http.StatusInternalServerError)
// slog.Error("Error reading template", "error", err)
// return
// }
data := PageData{ data := PageData{
Title: "Home", Title: "DyeForYarn",
} }
if err := tmpl.Execute(w, data); err != nil { if err := tpl.ExecuteTemplate(w, "base", data); err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError) http.Error(w, "Internal Server Error", http.StatusInternalServerError)
slog.Error("Error executing template", "error", err) slog.Error("Error executing template", "error", err)
} }

@@ -24,6 +24,7 @@ func init() {
if debug { if debug {
programLevel = slog.LevelDebug programLevel = slog.LevelDebug
} }
programLevel = slog.LevelDebug
if jsonLogger { if jsonLogger {
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
@@ -60,7 +61,7 @@ func main() {
mux.Handle("GET /static/", http.StripPrefix("/static/", fileServer)) mux.Handle("GET /static/", http.StripPrefix("/static/", fileServer))
mux.HandleFunc("GET /favicon.ico", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("GET /favicon.ico", func(w http.ResponseWriter, r *http.Request) {
data, err := static.ReadFile("web/static/img/favicon.ico") data, err := static.ReadFile("web/static/favicon.ico")
if err != nil { if err != nil {
http.NotFound(w, r) http.NotFound(w, r)
return return

Binary file not shown.

Before

(image error) Size: 12 KiB

258
web/static/css/app.css Normal file

@@ -0,0 +1,258 @@
body {
width: 100%;
height: 100%;
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
color: #000;
background-color: #fff;
}
html {
width: 100%;
height: 100%;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
/* font-weight: 700; */
/* letter-spacing: 1px; */
}
.newsitem h4 {
margin: 0 0 15px;
}
.newsitem p {
margin: 0 0 5px;
}
.newsfooter {
margin: 0 0 30px;
}
p {
font-size: 20px;
line-height: 1.5em;
}
.modal {
overflow: auto;
color: #333;
}
@media (min-width: 1200px) {
.navbar {
font-size: 20px;
}
}
.navbar-brand img {
height: 30px;
}
#langSelect {
min-width: 40px;
}
#impressum {
padding-top: 100px;
}
.featurette {
text-align: justify;
}
.featurette-heading {
padding: 20px 0 0 0;
}
.stockist-tile {
width: 95%;
font-size: 18px;
}
.intro {
display: table;
width: 100%;
height: 100%;
padding: 100px 0;
text-align: center;
color: #000;
background: url(../img/montage.jpg) no-repeat bottom center scroll;
background-color: #fff;
-webkit-background-size: cover;
-moz-background-size: cover;
background-size: cover;
-o-background-size: cover;
}
.intro .intro-body {
display: table-cell;
vertical-align: middle;
}
.center-block {
display: block;
margin-left: auto;
margin-right: auto;
}
.btn-circle {
width: 70px;
height: 70px;
margin-top: 15px;
padding: 7px 16px;
border-radius: 100% !important;
font-size: 40px;
color: #000;
background: #fff;
-webkit-transition: background 0.3s ease-in-out;
-moz-transition: background 0.3s ease-in-out;
transition: background 0.3s ease-in-out;
}
.content-section {
padding-top: 200px;
}
footer {
padding: 50px 0;
}
footer p {
margin: 0;
}
#shop ul {
list-style: disc;
}
#shop li {
text-align: left;
font-size: 18px;
}
address {
font-size: 18px;
}
body {
webkit-tap-highlight-color: rgba(255, 255, 255, 0.2);
}
footer {
padding: 50px 0;
}
footer p {
margin: 0;
}
#tagsselect {
height: 250px;
}
legend {
color: #fff;
background: #b8b8b8;
padding: 2px 6px;
}
legend {
color: #fff;
background: #b8b8b8;
padding: 2px 6px;
}
.imagewrapper {
position: relative;
height: 600px;
width: 600px;
}
.listbox {
width: 50px;
color: #fff;
position: relative;
float: left;
}
.listbox img {
width: 90%;
height: auto;
overflow: hidden;
display: block;
margin: 0 auto;
}
.box {
width: 300px;
height: 600px;
color: #fff;
position: relative;
float: left;
padding-top: 20px;
}
.box img {
width: 90%;
height: auto;
overflow: hidden;
}
.innerContent {
position: absolute;
left: 1px;
right: 1px;
top: 1px;
bottom: 1px;
padding: 10px;
}
#listing ul li {
list-style-type: none;
display: block;
}
table {
width: 100%;
}
th {
background: #b8b8b8;
text-align: center;
}
.content-admin {
padding-top: 90px;
}
.site-footer {
flex: none;
}
footer {
width: 100%;
padding: 0.1rem 1rem;
line-height: 1.5;
}
.footer-list {
list-style-type: none;
padding-left: 0;
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
margin-top: 5px;
margin-bottom: 5px;
}
.footer-list-item {
margin: 0rem 0.8rem;
white-space: nowrap;
}

4085
web/static/css/bootstrap-grid.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

6
web/static/css/bootstrap-grid.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4084
web/static/css/bootstrap-grid.rtl.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2106
web/static/css/bootstrap-icons.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

597
web/static/css/bootstrap-reboot.css vendored Normal file

@@ -0,0 +1,597 @@
/*!
* Bootstrap Reboot v5.3.6 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
line-height: inherit;
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

594
web/static/css/bootstrap-reboot.rtl.css vendored Normal file

@@ -0,0 +1,594 @@
/*!
* Bootstrap Reboot v5.3.6 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
line-height: inherit;
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5406
web/static/css/bootstrap-utilities.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5397
web/static/css/bootstrap-utilities.rtl.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

12043
web/static/css/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

6
web/static/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

12016
web/static/css/bootstrap.rtl.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

6
web/static/css/bootstrap.rtl.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@@ -1,51 +0,0 @@
@font-face {
font-display:swap;
font-family:"flowtext";
font-style:normal;
font-weight:normal;
src:
url("fonts/poppins-western.woff2") format("woff2"),
url("fonts/poppins-western.woff") format("woff");
}
@font-face {
font-display:swap;
font-family:"flowtext";
font-style:normal;
font-weight:bold;
src:
url("fonts/poppins-western-bold.woff2") format("woff2"),
url("fonts/poppins-western-bold.woff") format("woff");
}
@font-face {
font-display:swap;
font-family:interface;
font-style:normal;
font-weight:normal;
src:
url("fonts/interface-Regular.woff2") format("woff2"),
url("fonts/interface-Regular.woff") format("woff");
}
[class*="icon_"]:not(.iconAfter):before,
[class*="icon_"].iconAfter:after {
content:var(--iconChar);
display:inline-block;
vertical-align:middle;
position:relative;
font-family:interface;
font-weight:normal;
line-height:1;
}
.icon_x { --iconChar:"\E61B"; }
.icon_close { --iconChar:"\F00D"; }
.icon_linkedIn { --iconChar:"\F08C"; }
.icon_facebook { --iconChar:"\F09A"; }
.icon_medium { --iconChar:"\F23A"; }
.icon_accessibility { --iconChar:"\F368"; }
.icon_web { --iconChar:"\F57D"; }
.icon_efficiency { --iconChar:"\F625"; }
.icon_workplace { --iconChar:"\F7D9"; }
.icon_caratUp { --iconChar:"\F102"; }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@@ -1,138 +0,0 @@
.action,
#backToTop,
#mainMenu,
.modal,
.optional,
#socialMedia {
display:none;
}
figure, blockquote {
padding:0;
margin:0;
}
body, button, input, table, textarea, select {
font-size:12pt;
line-height:1.75;
font-family:flowtext,sans-serif;
}
body {
max-width:7.5in;
margin:0 auto;
}
a {
color:#000;
text-decoration:none;
}
header {
margin-bottom:1rem;
}
p {
margin:0 0 1rem;
}
li {
margin-bottom:0.5rem;
}
h2 {
font-size:24pt;
font-weight:normal;
margin:0 0 0.5rem;
}
h1,
.hero h2 {
margin:0;
line-height:1.2;
}
h3 {
font-size:16pt;
font-weight:normal;
margin:0;
}
main > section {
padding-bottom:1.75rem;
}
main > section header p {
font-size:14pt;
}
.hero header p {
margin-top:0;
}
.hasPlate,
.cards {
display:flex;
flex-wrap:wrap;
justify-content:center;
gap:1rem 2rem;
}
.hasPlate > figure {
flex-grow:0;
width:min(12rem, 100%);
text-align:center;
}
.hasPlate > figure img {
width:100%;
height:auto;
border-radius:1rem;
}
.hasPlate > div {
width:1%;
flex-grow:1;
}
.cards > * {
width:calc(50% - 1rem);
break-inside:avoid;
}
.cards > * > *:last-child {
margin-bottom:0;
padding-bottom:0;
}
#whatIDo h3[class*="icon_"]:before {
font-size:36pt;
margin-right:0.5rem;
}
#testimonials figcaption {
font-size:14pt;
margin-bottom:0.5rem;
}
#testimonials figcaption img {
display:inline-block;
vertical-align:middle;
width:3rem;
height:3rem;
margin-right:0.25rem;
border-radius:50%;
}
#whatIDo ul,
#testimonials blockquote {
font-size:10pt;
}
.note {
text-align:center;
}
#fauxBody > footer {
text-align:center;
}

@@ -1,763 +0,0 @@
:root {
--flowColor:#024;
--flowBg:#FFF;
--flowAltBg:#CDF;
--flowAltBorder:0.0625rem solid #04F;
--flowAnchorNormal:#04F;
--flowAnchorVisited:#000;
--flowAnchorHover:#069;
--flowMarker:#080;
--flyoutColor:#36C;
--flyoutBgColor:#ACE;
--chromeColor:#000;
--chromeBg:var(--flowBg);
--chromeAnchorNormal:var(--chromeColor);
--chromeAnchorVisited:var(--chromeColor);
--chromeAnchorHover:#369;
--mainHeadingColor:#356;
--modalOuterBg:#ACEC;
--modalOuterShadow:inset 0 0 16em #68A;
--modalInnerBg:#DEF;
--modalInputBg:#FFF;
--modalInputBorder:0.125rem solid #048;
--modalHeadingBg:#ACE;
--modalButtonColor:#FFF;
--modalButtonBg:#048;
--modalShadow:0.5rem 0.5rem 2rem #0247;
--actionColor:#039;
--actionBg:#FFF;
--actionBorder:0.125rem solid var(--actionColor);
--actionHoverColor:#FFF;
--actionHoverBg:#05A;
--heroColor:#FFF;
--heroBgColor:#05A;
--heroBg:linear-gradient(20deg, #05A, #012);
--heroTextShadow:
0 0 2rem #000,
0.25rem 0.25rem 1rem #000;
--heroActionColor:#FFF;
--heroActionBg:transparent;
--heroActionHoverColor:#036;
--heroActionHoverBg:#8CF;
--borderColor:#048;
--standardBorder:0.125rem solid var(--borderColor);
--horzPad:clamp(0.5rem, 4vw, 2rem);
--vertPad:clamp(1rem, min(8vw, 10vh), 4rem);
--standardPad:var(--vertPad) var(--horzPad);
--chromePad:1rem var(--horzPad);
--heroPad:clamp(1rem, 3vh, 6rem) var(--horzPad);
}
html,body,div,p,h1,h2,h3,h4,h5,h6,figure,
ul,ol,li,dl,dt,dd,form,fieldset,caption,legend,
table,tr,td,th,address,blockquote,img {
margin:0;
padding:0;
}
img, fieldset {
border:none;
}
blockquote, q {
quotes:none;
}
body *, *:after, *:before {
box-sizing:border-box;
}
legend {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
display:block;
}
button, label, summary {
cursor:pointer;
}
html, body {
height:100%;
}
body, button, input, table, textarea, select {
font-size:1rem;
line-height:1.75;
font-family:flowtext,sans-serif;
color:var(--flowColor);
background:var(--flowBg);
}
a {
color:var(--flowAnchorNormal);
transition:color 0.3s, background 0.3s, scale 0.3s;
}
a:visited {
color:var(--flowAnchorVisited);
}
a:active,
a:focus,
a:hover {
color:var(--flowAnchorHover);
}
input,
select,
textarea {
padding:0.25rem 0.5rem;
}
#fauxBody,
.modal,
.modal > .modalClose {
position:fixed;
top:0;
left:0;
width:100%;
height:100%;
overflow:auto;
scroll-behavior:smooth;
}
.modal,
#top,
.cards,
.hasPlate,
#fauxBody > footer {
position:relative;
display:flex;
flex-wrap:wrap;
align-items:center;
justify-content:center;
}
.modalClose span,
.mainMenuOpen span,
#fauxBody > footer h2.optional {
position:fixed;
right:999em;
top:0;
opacity:0;
}
.modal {
left:-200vw;
background:var(--modalOuterBg);
box-shadow:var(--modalOuterShadow);
opacity:0;
transition:left 0s 0.5s, opacity 0.5s;
}
.modal:target {
left:0;
opacity:1;
transition:opacity 0.5s;
}
.modal > div {
/*
depth sort over outer .modalClose
*/
position:relative;
/*
if you don't auto margin, scrolling at small screen heights is messed.
*/
margin:auto 1rem;
overflow:hidden;
background:var(--modalInnerBg);
color:var(--flowColor);
box-shadow:var(--modalShadow);
border:var(--standardBorder);
border-radius:1rem;
scale:0;
transition:scale 0.5s;
}
.modal:target > div {
scale:1;
}
.modal .modalClose,
#mainMenu .modalClose {
position:absolute;
text-decoration:none;
}
.modal:target .modalClose {
display:block;
}
.modal > * > .modalClose,
#mainMenu > * > .modalClose {
top:0.5rem;
right:1rem;
font-size:2rem;
line-height:1;
color:var(--flowColor);
}
.modal > * > .modalClose:focus,
.modal > * > .modalClose:hover {
scale:1.2;
}
.modal h2 {
font-size:1.25rem;
padding:0.5rem 4rem 0.5rem 1rem;
margin-bottom:1rem;
background:var(--modalHeadingBg);
border-bottom:var(--standardBorder);
}
.modal h2 ~ * {
margin:1rem;
}
#top,
#fauxBody > footer {
max-width:72rem;
margin:0 auto;
padding:var(--chromePad);
background:var(--chromeBgColor);
color:var(--chromeColor);
}
#fauxBody > footer {
z-index:800;
}
#fauxBody > footer p span {
display:inline-block;
}
#top {
justify-content:space-between;
gap:2rem;
z-index:900;
}
#top a,
#fauxBody > footer a {
color:var(--chromeAnchorNormal);
text-decoration:none;
}
#top > a:first-child {
display:block;
overflow:hidden;
flex-grow:0;
font-size:0.875rem;
line-height:1.1;
}
h1 {
font-size:2rem;
text-transform:uppercase;
transform-origin:center left;
letter-spacing:0.125rem;
scale:1.15 1;
color:var(--mainHeadingColor);
}
#mainMenu {
flex-grow:1;
text-align:right;
}
#mainMenu li {
list-style:none;
display:inline;
margin-right:1.5rem;
}
#mainMenu li a {
display:inline-block;
font-size:1.125rem;
}
#mainMenu li a:focus,
#mainMenu li a:hover,
.socialMenu a:focus,
.socialMenu a:hover,
.mainMenuOpen:focus,
.mainMenuOpen:hover {
color:var(--chromeAnchorHover);
scale:1.2;
}
#fauxBody > footer > section:first-child {
width:1%;
flex-grow:1;
}
.socialMenu {
list-style:none;
display:flex;
gap:1.5rem;
}
.socialMenu a {
position:relative;
display:block;
}
.socialMenu a:before {
font-size:2.5rem;
transition:color 0.3s, scale 0.3s;
}
.socialMenu a:focus:before,
.socialMenu a:hover:before {
scale:1.375;
}
.socialMenu a span,
#backToTop span {
position:absolute;
font-size:0.875rem;
color:var(--flyoutColor);
background:var(--flyoutBgColor);
border:0.125rem solid var(--flyoutColor);
}
.socialMenu a span {
bottom:3.5rem;
right:999em;
padding:0.25rem 0.75rem;
white-space:nowrap;
border-radius:1rem;
transition:right 0s 0.3s, opacity 0.3s;
opacity:0;
}
.socialMenu a span:after {
content:"";
position:absolute;
bottom:-0.5625rem;
right:1rem;
width:1rem;
height:1rem;
background:var(--flyoutBgColor);
border:solid var(--flyoutColor);
border-width:0 0.125rem 0.125rem 0;
rotate:45deg;
}
.socialMenu a:focus span,
.socialMenu a:hover span {
right:-0.5rem;
opacity:1;
transition:opacity 0.3s;
}
main > section:not(.hero),
.hero > div,
.hasCards > header,
.hasPlate {
max-width:56rem;
margin:0 auto;
}
main > section:not(.hero),
.hero > div,
.hasPlate {
padding:var(--standardPad);
}
.hasPlate {
padding-top:0;
}
main > section:not(.hero) {
border-bottom:var(--flowAltBorder);
}
main > section > header:not(.hasPlate) {
text-align:center;
}
main > section:not(.hero):nth-child(odd) {
background:var(--flowAltBg);
}
main h2 {
font-size:clamp(1.75rem, 5vw, 2.5rem);
font-weight:normal;
}
main h2 span {
display:inline-block; /* soft keep-together */
}
main h3 {
font-size:clamp(1.25rem, 3vw, 2rem);
font-weight:normal;
}
main p {
max-width:40em;
margin:1em 0;
}
main section > header p {
font-size:1.125rem;
}
main > section > header:not(.hasPlate) p {
margin:1em auto;
}
main > section.hasCards {
max-width:100%;
}
.cards,
.hasPlate {
gap:2rem;
}
.cards {
margin:2rem auto 0;
align-items:stretch;
gap:2rem 4rem;
}
#whatIDo .cards {
max-width:68em;
}
.cards > * {
flex-grow:1;
width:1%;
min-width:min(20rem, 100%);
max-width:24rem;
}
#whatIDo .cards > * {
min-width:min(24rem, 100%);
max-width:40rem;
}
.cards h3[class*="icon_"]:before {
font-size:4rem;
margin-right:1rem;
}
.cards li {
list-style:none;
position:Relative;
margin-bottom:0.5rem;
padding-left:2rem;
}
.cards li:before {
content:"\F058";
position:absolute;
top:0;
left:0.5rem;
color:var(--flowMarker);
font-family:interface;
}
.hasPlate > div {
flex-grow:1;
width:1%;
min-width:min(20rem, 100%);
}
.hasPlate.trailing > figure,
.hasPlate.trailing > picture {
position:relative;
flex-grow:0;
width:30%;
max-width:16rem;
text-align:center;
}
figure img,
figure picture {
width:100%;
height:auto;
border-radius:1rem;
}
.note {
text-align:center;
}
.action {
display:inline-block;
position:relative;
overflow:hidden;
margin-top:1rem;
z-index:1;
text-decoration:none;
padding:0.75rem 1.5rem;
color:var(--actionColor);
background:var(--actionBg);
border:var(--actionBorder);
border-radius:0.5em;
transition:color 0.3s, text-shadow 0.3s;
}
.action:focus,
.action:hover {
color:var(--actionHoverColor);
text-shadow:none;
}
.action:after {
content:"";
position:absolute;
z-index:-1;
top:50%;
left:50%;
width:100%;
height:100%;
border-radius:0.5rem;
translate:-50% -50%;
scale:0;
opacity:0;
background:var(--actionHoverBg);
transition:scale 0.3s, opacity 0.3s;
}
.action:focus:after,
.action:hover:after {
scale:1.1;
opacity:1;
}
.hero {
padding:var(--heroPad);
background-color:var(--heroBgColor);
color:var(--heroColor);
text-shadow:var(--heroTextShadow);
}
.hero .action {
color:var(--heroActionColor);
background:var(--heroActionBg);
border-color:var(--heroActionColor);
}
.hero .action:focus,
.hero .action:hover {
color:var(--heroActionHoverColor);
}
.hero .action:after {
background:var(--heroActionHoverBg);
}
.hero header {
margin-bottom:1.5rem;
line-height:1.2;
}
.hero header p {
margin:0.25rem 0 1.5rem;
font-size:1.5rem;
}
#semanticEasy {
background-image:url(images/heroBg.avif), var(--heroBg);
background-position:center;
background-size:cover;
}
section:not(.hero) h2,
section:not(.hero) h3 {
color:var(--mainHeadingColor);
}
#testimonials > header {
margin-bottom:var(--vertPad);
}
#testimonials > .cards {
max-width:76rem;
margin:0 auto;
}
#testimonials figcaption {
font-size:1.25rem;
font-style:italic;
}
#testimonials figcaption img {
display:inline-block;
vertical-align:middle;
width:4rem;
height:4rem;
margin-right:0.5rem;
border-radius:50%;
}
#backToTop {
display:block;
position:sticky;
z-index:600;
bottom:0;
width:2.5rem;
height:3.5rem;
padding-bottom:1rem;
margin:-3.5rem 1rem 0 auto;
opacity:0.6;
transition:opacity 0.3s;
}
#backToTop.hide {
opacity:0;
}
#backToTop:not(.hide):focus,
#backToTop:not(.hide):hover {
opacity:1;
}
#backToTop span {
right:1.5rem;
top:0.25rem;
padding:0.125rem 2rem 0.125rem 1rem;
white-space:nowrap;
border-radius:1.5rem 0 0 1.5rem;
transform-origin:center right;
transition:scale 0.3s;
scale:0 1;
}
#backToTop:focus span,
#backToTop:hover span {
scale:1;
}
#backToTop:after {
content:"\F102";
position:relative;
display:block;
width:2.5rem;
height:2.5rem;
text-align:center;
font-family:interface;
font-size:1.5rem;
line-height:2rem;
border:0.25rem solid var(--flyoutColor);
border-radius:50%;
background:var(--heroBgColor);
color:var(--heroColor);
}
@media (max-width:56rem) {
/*
It sucks to have to repeat all this,
one of the few cases where native mixins
would be a godsend.
*/
#mainMenu,
#mainMenu > .modalClose {
top:0;
left:0;
width:100%;
height:100%;
overflow:auto;
scroll-behavior:smooth;
}
#mainMenu {
position:fixed;
display:flex;
flex-wrap:wrap;
align-items:center;
justify-content:center;
left:-200vw;
background:var(--modalOuterBg);
box-shadow:var(--modalOuterShadow);
opacity:0;
transition:left 0s 0.5s, opacity 0.5s;
}
#mainMenu:target {
left:0;
opacity:1;
transition:opacity 0.5s;
}
#mainMenu > div {
position:relative;
margin:auto 1rem;
overflow:hidden;
background:var(--modalInnerBg);
color:var(--flowColor);
box-shadow:var(--modalShadow);
border:var(--standardBorder);
border-radius:1rem;
scale:0;
transition:scale 0.5s;
}
#mainMenu:target > div {
scale:1;
}
#mainMenu:target .modalClose {
display:block;
}
#mainMenu > * > .modalClose:focus,
#mainMenu > * > .modalClose:hover {
scale:1.2;
}
#mainMenu > div:before {
content:attr(data-modalTitle);
display:block;
font-size:1.25rem;
padding:0.5rem 4rem 0.5rem 1rem;
margin-bottom:1rem;
background:var(--modalHeadingBg);
border-bottom:var(--standardBorder);
}
#mainMenu ul {
margin:1rem;
}
#mainMenu li {
display:block;
text-align:center;
margin:0.5rem 0;
}
.mainMenuOpen {
display:block;
width:2.5rem;
height:2rem;
background:linear-gradient(
#000 20%,
transparent 20% 40%,
#000 40% 60%,
transparent 60% 80%,
#000 80%
);
}
} /* max-width:56rem */

@@ -1 +0,0 @@
<svg width="16em" height="16em" viewBox="0 0 203.2 203.2" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.20387 .2137 -.20387 .2137 128.46 -10.68)"><path d="m271.76 703.73-211.3-314.83 276.27-58.724-64.977 373.55" fill="#d5b360"/><path d="m271.76 703.73-211.3-314.83 276.27-58.724z" fill-opacity="0" stroke="#3e3632" stroke-linecap="round" stroke-linejoin="round" stroke-width="11"/><path d="m215.67 405.24 65.519 63.54m-76.56 6.867 63.54-65.519m-45.433 88.23 63.54-65.519m-84.739 15.245 65.519 63.541" fill-opacity="0" stroke="#3e3632" stroke-linecap="round" stroke-linejoin="round" stroke-width="8"/><path d="m328.56 236.75c3.897-10.97 5.02-23.007 2.554-34.554-4.783-22.409-21.817-36.657-41.676-37.89 1.346-7.609 1.314-15.557-0.369-23.415-5.828-27.213-28.979-44.343-53.839-40.513-6.532-24.271-27.356-39.494-49.689-38.994-3.032-7.637-17.489-39.799-49.025-49.658-22.371-6.975-82.684 7.057-82.687 7.05-3e-3 -0.012 25.332 8.591 40.719 33.116 4.867 7.753 7.006 17.012 7.502 26.468-1.321 0.266-2.643 0.532-3.964 0.797-25.644 5.213-42.087 30.802-37.683 58.993-24.66 6.33-39.817 31.39-34.022 58.86 1.657 7.863 4.834 15.002 9.158 21.406-17.641 9.202-27.421 29.078-22.676 51.496 2.444 11.551 8.358 22.059 16.38 30.495-14.956 8.922-22.819 26.303-18.529 46.499 5.914 27.873 37.743 48.009 60.763 52.573 22.953 4.707 75.488 4.761 133.59-7.818 58.266-11.895 111.3-34.354 125.22-47.197 14.132-12.498 40.091-44.813 34.124-72.753-4.295-20.195-18.551-32.893-35.844-34.961" fill="#fffffe"/><path d="m328.56 236.75c3.897-10.97 5.02-23.007 2.554-34.554-4.783-22.409-21.817-36.657-41.676-37.89 1.346-7.609 1.314-15.557-0.369-23.415-5.828-27.213-28.979-44.343-53.839-40.513-6.532-24.271-27.356-39.494-49.689-38.994-3.032-7.637-17.489-39.799-49.025-49.658-22.371-6.975-82.684 7.057-82.687 7.05-3e-3 -0.012 25.332 8.591 40.719 33.116 4.867 7.753 7.006 17.012 7.502 26.468-1.321 0.266-2.643 0.532-3.964 0.797-25.644 5.213-42.087 30.802-37.683 58.993-24.66 6.33-39.817 31.39-34.022 58.86 1.657 7.863 4.834 15.002 9.158 21.406-17.641 9.202-27.421 29.078-22.676 51.496 2.444 11.551 8.358 22.059 16.38 30.495-14.956 8.922-22.819 26.303-18.529 46.499 5.914 27.873 37.743 48.009 60.763 52.573 22.953 4.707 75.488 4.761 133.59-7.818 58.266-11.895 111.3-34.354 125.22-47.197 14.132-12.498 40.091-44.813 34.124-72.753-4.295-20.195-18.551-32.893-35.844-34.961z" fill-opacity="0" stroke="#3e3632" stroke-linecap="round" stroke-linejoin="round" stroke-width="11"/><path d="m184.49 72.517c-0.108-0.604-13.1 42.635-107.01 66.574m149.56-23.297c-0.017 0.146-5.601 15.147-29.231 36.635-23.687 21.079-65.42 48.646-139.02 64.457m222.03-37.656c-0.109 0.174-8.437 23.849-40.838 53.951-32.5 29.173-89.075 64.773-187.98 67.361m265.38-48.424c-0.048-0.057-11.438 19.506-34.151 44.665-22.74 24.947-56.804 55.49-102.83 72.474m-84.823-340.9c0 3e-3 26.33 1.97 34.616 40.955" fill-opacity="0" stroke="#3e3632" stroke-linecap="round" stroke-linejoin="round" stroke-width="9"/></g></svg>

Before

(image error) Size: 2.9 KiB

Binary file not shown.

After

(image error) Size: 151 KiB

Binary file not shown.

After

(image error) Size: 84 KiB

Binary file not shown.

After

(image error) Size: 180 KiB

BIN
web/static/img/action.jpg Executable file

Binary file not shown.

After

(image error) Size: 107 KiB

Binary file not shown.

After

(image error) Size: 487 KiB

Binary file not shown.

After

(image error) Size: 288 KiB

Binary file not shown.

After

(image error) Size: 380 KiB

Binary file not shown.

After

(image error) Size: 450 KiB

Binary file not shown.

After

(image error) Size: 65 KiB

Binary file not shown.

After

(image error) Size: 63 KiB

Binary file not shown.

After

(image error) Size: 451 KiB

Binary file not shown.

After

(image error) Size: 462 KiB

Binary file not shown.

After

(image error) Size: 268 KiB

Binary file not shown.

After

(image error) Size: 540 KiB

Binary file not shown.

After

(image error) Size: 411 KiB

Binary file not shown.

After

(image error) Size: 368 KiB

Binary file not shown.

After

(image error) Size: 460 KiB

Binary file not shown.

After

(image error) Size: 320 KiB

Binary file not shown.

After

(image error) Size: 286 KiB

Binary file not shown.

After

(image error) Size: 458 KiB

Binary file not shown.

After

(image error) Size: 443 KiB

Binary file not shown.

After

(image error) Size: 571 KiB

Binary file not shown.

After

(image error) Size: 420 KiB

Binary file not shown.

After

(image error) Size: 424 KiB

Binary file not shown.

After

(image error) Size: 498 KiB

Binary file not shown.

After

(image error) Size: 480 KiB

Binary file not shown.

After

(image error) Size: 345 KiB

Binary file not shown.

After

(image error) Size: 568 KiB

Binary file not shown.

After

(image error) Size: 417 KiB

Binary file not shown.

After

(image error) Size: 201 KiB

Binary file not shown.

After

(image error) Size: 310 KiB

Binary file not shown.

After

(image error) Size: 520 KiB

Binary file not shown.

After

(image error) Size: 366 KiB

Binary file not shown.

After

(image error) Size: 279 KiB

Binary file not shown.

After

(image error) Size: 331 KiB

Binary file not shown.

After

(image error) Size: 270 KiB

Binary file not shown.

After

(image error) Size: 411 KiB

Binary file not shown.

After

(image error) Size: 228 KiB

Binary file not shown.

After

(image error) Size: 569 KiB

Binary file not shown.

After

(image error) Size: 572 KiB

Binary file not shown.

After

(image error) Size: 524 KiB

Binary file not shown.

After

(image error) Size: 600 KiB

Binary file not shown.

After

(image error) Size: 485 KiB

Binary file not shown.

After

(image error) Size: 512 KiB

Binary file not shown.

After

(image error) Size: 461 KiB

Some files were not shown because too many files have changed in this diff Show More