Reset project

This commit is contained in:
Jan Eitzinger 2025-05-25 10:14:48 +02:00
parent 542d28e7a9
commit 6e443de84f
197 changed files with 64591 additions and 1027 deletions

2
.gitignore vendored
View File

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

18
Dockerfile Normal file
View 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

View File

@ -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:
$(TARGET): components
$(info ===> BUILD site)
@go build ./cmd/site
components:
$(info ===> BUILD templates)
cd web/components && templ generate
clean:
$(info ===> CLEAN)
@go clean
@rm -f $(TARGET)
build:
@echo "Generate Tailwind CSS..."
go generate
@echo "Building Go server..."
go build -o tmp/server main.go
@echo "Build complete."

View File

@ -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
}

View File

@ -14,19 +14,26 @@ type PageData struct {
func RootHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
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
}
slog.Info("Render root handler")
tpl := template.Must(template.ParseFS(web.Templates, "templates/index.html", "templates/base.html"))
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{
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)
slog.Error("Error executing template", "error", err)
}

View File

@ -24,6 +24,7 @@ func init() {
if debug {
programLevel = slog.LevelDebug
}
programLevel = slog.LevelDebug
if jsonLogger {
jsonHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
@ -60,7 +61,7 @@ func main() {
mux.Handle("GET /static/", http.StripPrefix("/static/", fileServer))
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 {
http.NotFound(w, r)
return

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

258
web/static/css/app.css Normal file
View 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
View 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
View 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

View File

@ -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.

View File

@ -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;
}

View File

@ -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 */

View File

@ -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

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

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