Compare commits
10 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8590be81a1 | |||
| ca60e3088d | |||
| f63128a68f | |||
| bdff1ffd80 | |||
| 98afab44ca | |||
| 2766c7c4b3 | |||
| 2fb5bdb9c8 | |||
| fc36e63d84 | |||
| af2b407c52 | |||
| bad7e8e689 |
36 changed files with 2681 additions and 788 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,2 +1,3 @@
|
||||||
public/
|
public/
|
||||||
resources/
|
resources/
|
||||||
|
node_modules/
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# All available Hugo versions are listed under https://gitlab.com/pages/hugo/container_registry.
|
# All available Hugo versions are listed under https://gitlab.com/pages/hugo/container_registry.
|
||||||
#
|
#
|
||||||
image: hugomods/hugo:base
|
image: hugomods/hugo:node-non-root
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- build
|
- build
|
||||||
|
|
@ -9,7 +9,10 @@ stages:
|
||||||
pages:
|
pages:
|
||||||
stage: build
|
stage: build
|
||||||
script:
|
script:
|
||||||
|
- npm ci
|
||||||
- hugo
|
- hugo
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- public
|
- public
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "main"
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,9 @@ when:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: build
|
- name: build
|
||||||
image: hugomods/hugo:base
|
image: hugomods/hugo:exts-node
|
||||||
commands:
|
commands:
|
||||||
|
- npm ci
|
||||||
- hugo
|
- hugo
|
||||||
environment:
|
environment:
|
||||||
HUGO_ENVIRONMENT: production
|
HUGO_ENVIRONMENT: production
|
||||||
|
|
|
||||||
970
assets/scss/bootstrap.scss
vendored
Normal file
970
assets/scss/bootstrap.scss
vendored
Normal file
|
|
@ -0,0 +1,970 @@
|
||||||
|
// ============================================================================
|
||||||
|
// happyDomain × Bootstrap 5 — SCSS Customization
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Drop-in override for a Bootstrap 5 (>=5.3) build.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
// 1. Have Bootstrap's SCSS source available (`bootstrap/scss/...`)
|
||||||
|
// 2. Compile this file as your single entry point:
|
||||||
|
// sass happydomain-bootstrap.scss happydomain-bootstrap.css
|
||||||
|
// 3. Include the compiled CSS.
|
||||||
|
//
|
||||||
|
// Targets Bootstrap 5.3+ (uses the `$theme-colors`, `$utilities`,
|
||||||
|
// `data-bs-theme` and color-mode CSS-var system).
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 1. FONTS — Brand display + UI + Mono
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 2. BRAND TOKENS (mirror of colors_and_type.css — kept as Sass scalars so
|
||||||
|
// they can drive Bootstrap maps before `@import "bootstrap"`.)
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// — Brand plum ramp ──────────────────────────────────────────────────────────
|
||||||
|
$hd-plum-50: #f7f1fa;
|
||||||
|
$hd-plum-100: #ecdcf2;
|
||||||
|
$hd-plum-200: #d6b1e3;
|
||||||
|
$hd-plum-300: #b985ce;
|
||||||
|
$hd-plum-400: #985bb3;
|
||||||
|
$hd-plum-500: #743b91;
|
||||||
|
$hd-plum-600: #54206c;
|
||||||
|
$hd-plum-700: #360b48; // BRAND DARK ANCHOR
|
||||||
|
$hd-plum-800: #240630;
|
||||||
|
$hd-plum-900: #14031c;
|
||||||
|
|
||||||
|
// — Brand dark semantic roles (plum surface system) ───────────────────────────
|
||||||
|
$hd-brand-dark: $hd-plum-700; // canonical plum surface
|
||||||
|
$hd-brand-dark-hover: $hd-plum-800; // deepen on hover/active
|
||||||
|
$hd-brand-dark-fg: $hd-plum-50; // primary text on plum surface
|
||||||
|
$hd-brand-dark-muted: $hd-plum-200; // secondary text / eyebrows on plum surface
|
||||||
|
$hd-brand-dark-border: $hd-plum-600; // dividers within plum surfaces
|
||||||
|
$hd-brand-dark-subtle: $hd-plum-50; // subtle plum tint on light backgrounds
|
||||||
|
|
||||||
|
// — Dark mode canvas (plum-tinted, replaces green-tinted #0c0f0e) ─────────────
|
||||||
|
$hd-bg-canvas-dark: #0f0a11;
|
||||||
|
|
||||||
|
// — Brand green ramp ──────────────────────────────────────────────────────────
|
||||||
|
$hd-green-50: #edfaf5;
|
||||||
|
$hd-green-100: #d0f2e6;
|
||||||
|
$hd-green-200: #9de4ca;
|
||||||
|
$hd-green-300: #56c8a4;
|
||||||
|
$hd-green-400: #2dba93;
|
||||||
|
$hd-green-500: #1cb487; // PRIMARY
|
||||||
|
$hd-green-600: #17a377;
|
||||||
|
$hd-green-700: #128f67;
|
||||||
|
$hd-green-800: #0d7254;
|
||||||
|
$hd-green-900: #084d38;
|
||||||
|
|
||||||
|
// — Neutrals (light) ─────────────────────────────────────────────────────────
|
||||||
|
$hd-bg-canvas: #ffffff;
|
||||||
|
$hd-bg-default: #fafafa;
|
||||||
|
$hd-bg-subtle: #f4f4f5;
|
||||||
|
$hd-bg-inset: #eeeeef;
|
||||||
|
|
||||||
|
$hd-fg-1: #0a0a0b;
|
||||||
|
$hd-fg-2: #3f3f46;
|
||||||
|
$hd-fg-3: #71717a;
|
||||||
|
$hd-fg-4: #a1a1aa;
|
||||||
|
|
||||||
|
$hd-border-1: #e4e4e7;
|
||||||
|
$hd-border-2: #d1d1d6;
|
||||||
|
$hd-border-3: #a1a1aa;
|
||||||
|
|
||||||
|
// — Semantic ─────────────────────────────────────────────────────────────────
|
||||||
|
$hd-success: $hd-green-500;
|
||||||
|
$hd-success-bg: $hd-green-50;
|
||||||
|
$hd-danger: #e5484d;
|
||||||
|
$hd-danger-bg: #fff1f2;
|
||||||
|
$hd-warning: #f59e0b;
|
||||||
|
$hd-warning-bg: #fffbeb;
|
||||||
|
$hd-info: #0ea5e9;
|
||||||
|
$hd-info-bg: #f0f9ff;
|
||||||
|
|
||||||
|
// — Focus ring ───────────────────────────────────────────────────────────────
|
||||||
|
$hd-focus-ring: rgba(28, 180, 135, 0.22);
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 3. BOOTSTRAP VARIABLE OVERRIDES
|
||||||
|
// (declared BEFORE importing bootstrap/scss/variables)
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// ── Color system ────────────────────────────────────────────────────────────
|
||||||
|
// Re-point Bootstrap's $green to our brand ramp so the generated utilities
|
||||||
|
// (`text-success`, `bg-success`, etc) match exactly.
|
||||||
|
$primary: $hd-green-500;
|
||||||
|
$secondary: $hd-fg-3;
|
||||||
|
$success: $hd-green-500;
|
||||||
|
$info: $hd-info;
|
||||||
|
$warning: $hd-warning;
|
||||||
|
$danger: $hd-danger;
|
||||||
|
$light: $hd-bg-subtle;
|
||||||
|
$dark: $hd-fg-1;
|
||||||
|
|
||||||
|
// Bootstrap 5.3 builds its grayscale from $gray-* — align it to Zinc-ish.
|
||||||
|
$white: #ffffff;
|
||||||
|
$gray-100: $hd-bg-subtle;
|
||||||
|
$gray-200: $hd-bg-inset;
|
||||||
|
$gray-300: $hd-border-1;
|
||||||
|
$gray-400: $hd-border-2;
|
||||||
|
$gray-500: $hd-border-3;
|
||||||
|
$gray-600: $hd-fg-3;
|
||||||
|
$gray-700: $hd-fg-2;
|
||||||
|
$gray-800: #27272a;
|
||||||
|
$gray-900: $hd-fg-1;
|
||||||
|
$black: #000000;
|
||||||
|
|
||||||
|
// Custom theme color: "accent" — same green but available as a separate slot
|
||||||
|
// so designers can use `.btn-accent`, `.text-accent`, etc.
|
||||||
|
$custom-theme-colors: (
|
||||||
|
"accent": $hd-green-500,
|
||||||
|
"brand": $hd-green-500,
|
||||||
|
"plum": $hd-plum-500,
|
||||||
|
);
|
||||||
|
|
||||||
|
// ── Body / surfaces ─────────────────────────────────────────────────────────
|
||||||
|
$body-bg: $hd-bg-default;
|
||||||
|
$body-color: $hd-fg-2;
|
||||||
|
$body-secondary-color: $hd-fg-3;
|
||||||
|
$body-secondary-bg: $hd-bg-subtle;
|
||||||
|
$body-tertiary-color: $hd-fg-4;
|
||||||
|
$body-tertiary-bg: $hd-bg-inset;
|
||||||
|
$body-emphasis-color: $hd-fg-1;
|
||||||
|
|
||||||
|
// ── Borders ─────────────────────────────────────────────────────────────────
|
||||||
|
$border-color: $hd-border-1;
|
||||||
|
$border-color-translucent: $hd-border-1;
|
||||||
|
|
||||||
|
$border-radius: 6px; // --hd-radius
|
||||||
|
$border-radius-sm: 4px; // --hd-radius-sm
|
||||||
|
$border-radius-lg: 8px; // --hd-radius-md
|
||||||
|
$border-radius-xl: 12px; // --hd-radius-lg
|
||||||
|
$border-radius-xxl: 12px;
|
||||||
|
$border-radius-pill: 9999px;
|
||||||
|
|
||||||
|
// ── Links ───────────────────────────────────────────────────────────────────
|
||||||
|
$link-color: $hd-green-500;
|
||||||
|
$link-hover-color: $hd-green-700;
|
||||||
|
$link-decoration: none;
|
||||||
|
$link-hover-decoration: underline;
|
||||||
|
|
||||||
|
// ── Typography ──────────────────────────────────────────────────────────────
|
||||||
|
$font-family-sans-serif:
|
||||||
|
"Hanken Grotesk Variable",
|
||||||
|
"Hanken Grotesk",
|
||||||
|
system-ui,
|
||||||
|
-apple-system,
|
||||||
|
"Segoe UI",
|
||||||
|
Roboto,
|
||||||
|
sans-serif;
|
||||||
|
$font-family-monospace:
|
||||||
|
"JetBrains Mono Variable", JetBrainsMono, "Fantasque Sans Mono", "SFMono-Regular", Menlo,
|
||||||
|
Consolas, monospace;
|
||||||
|
$font-family-base: $font-family-sans-serif;
|
||||||
|
|
||||||
|
$font-size-root: null; // honour browser default
|
||||||
|
$font-size-base: 0.9375rem; // 15px — --hd-text-base
|
||||||
|
$font-size-sm: 0.8125rem; // --hd-text-sm
|
||||||
|
$font-size-lg: 1.0625rem; // --hd-text-md
|
||||||
|
|
||||||
|
$font-weight-lighter: 300;
|
||||||
|
$font-weight-light: 300;
|
||||||
|
$font-weight-normal: 400;
|
||||||
|
$font-weight-medium: 500;
|
||||||
|
$font-weight-semibold: 600;
|
||||||
|
$font-weight-bold: 700;
|
||||||
|
$font-weight-base: $font-weight-normal;
|
||||||
|
|
||||||
|
$line-height-base: 1.5; // --hd-leading-normal
|
||||||
|
$line-height-sm: 1.375; // --hd-leading-snug
|
||||||
|
$line-height-lg: 1.625; // --hd-leading-relaxed
|
||||||
|
|
||||||
|
// Heading scale (matches --hd-text-*xl)
|
||||||
|
$h1-font-size: 2.25rem; // --hd-text-3xl
|
||||||
|
$h2-font-size: 1.875rem; // --hd-text-2xl
|
||||||
|
$h3-font-size: 1.5rem; // --hd-text-xl
|
||||||
|
$h4-font-size: 1.25rem; // --hd-text-lg
|
||||||
|
$h5-font-size: 1.0625rem; // --hd-text-md
|
||||||
|
$h6-font-size: 0.9375rem; // --hd-text-base
|
||||||
|
|
||||||
|
$headings-font-family: $font-family-sans-serif;
|
||||||
|
$headings-font-weight: 600;
|
||||||
|
$headings-line-height: 1.2;
|
||||||
|
$headings-color: $hd-fg-1;
|
||||||
|
|
||||||
|
$display-font-family: "Quicksand Variable", "Quicksand", sans-serif;
|
||||||
|
$display-font-weight: 700;
|
||||||
|
$display-line-height: 1.2;
|
||||||
|
|
||||||
|
$small-font-size: 0.8125rem;
|
||||||
|
$text-muted: $hd-fg-3;
|
||||||
|
|
||||||
|
// ── Spacing (Bootstrap's spacer scale — kept default, but explicit) ─────────
|
||||||
|
$spacer: 1rem;
|
||||||
|
$spacers: (
|
||||||
|
0: 0,
|
||||||
|
1: $spacer * 0.25,
|
||||||
|
// 4px
|
||||||
|
2: $spacer * 0.5,
|
||||||
|
// 8px
|
||||||
|
3: $spacer * 0.75,
|
||||||
|
// 12px
|
||||||
|
4: $spacer,
|
||||||
|
// 16px
|
||||||
|
5: $spacer * 1.25,
|
||||||
|
// 20px
|
||||||
|
6: $spacer * 1.5,
|
||||||
|
// 24px
|
||||||
|
7: $spacer * 2,
|
||||||
|
// 32px
|
||||||
|
8: $spacer * 2.5,
|
||||||
|
// 40px
|
||||||
|
9: $spacer * 3,
|
||||||
|
// 48px
|
||||||
|
10: $spacer * 4,
|
||||||
|
// 64px
|
||||||
|
11: $spacer * 5, // 80px
|
||||||
|
);
|
||||||
|
|
||||||
|
// ── Shadows — flat system, separation by border ─────────────────────────────
|
||||||
|
$enable-shadows: false;
|
||||||
|
$enable-gradients: false;
|
||||||
|
$enable-rounded: true;
|
||||||
|
$enable-transitions: true;
|
||||||
|
$enable-reduced-motion: true;
|
||||||
|
$enable-smooth-scroll: true;
|
||||||
|
|
||||||
|
$box-shadow: none;
|
||||||
|
$box-shadow-sm: none;
|
||||||
|
$box-shadow-lg: none;
|
||||||
|
$box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.04);
|
||||||
|
|
||||||
|
// ── Focus ring ──────────────────────────────────────────────────────────────
|
||||||
|
$focus-ring-width: 3px;
|
||||||
|
$focus-ring-opacity: 1;
|
||||||
|
$focus-ring-color: $hd-focus-ring;
|
||||||
|
$focus-ring-blur: 0;
|
||||||
|
$focus-ring-box-shadow: 0 0 0 $focus-ring-width $focus-ring-color;
|
||||||
|
|
||||||
|
// ── Components ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Buttons
|
||||||
|
$btn-font-weight: 500;
|
||||||
|
$btn-border-radius: $border-radius;
|
||||||
|
$btn-border-radius-sm: $border-radius-sm;
|
||||||
|
$btn-border-radius-lg: $border-radius-lg;
|
||||||
|
$btn-padding-y: 0.5rem;
|
||||||
|
$btn-padding-x: 0.875rem;
|
||||||
|
$btn-focus-width: 3px;
|
||||||
|
$btn-focus-box-shadow: $focus-ring-box-shadow;
|
||||||
|
$btn-disabled-opacity: 0.5;
|
||||||
|
$btn-transition:
|
||||||
|
color 0.12s ease-in-out,
|
||||||
|
background-color 0.12s ease-in-out,
|
||||||
|
border-color 0.12s ease-in-out;
|
||||||
|
|
||||||
|
// Forms
|
||||||
|
$input-bg: $hd-bg-canvas;
|
||||||
|
$input-color: $hd-fg-1;
|
||||||
|
$input-border-color: $hd-border-1;
|
||||||
|
$input-border-radius: $border-radius;
|
||||||
|
$input-border-radius-sm: $border-radius-sm;
|
||||||
|
$input-border-radius-lg: $border-radius-lg;
|
||||||
|
$input-padding-y: 0.5rem;
|
||||||
|
$input-padding-x: 0.75rem;
|
||||||
|
$input-placeholder-color: $hd-fg-4;
|
||||||
|
$input-focus-border-color: $hd-green-400;
|
||||||
|
$input-focus-box-shadow: $focus-ring-box-shadow;
|
||||||
|
$input-box-shadow: $box-shadow-inset;
|
||||||
|
|
||||||
|
$form-label-color: $hd-fg-2;
|
||||||
|
$form-label-font-weight: 500;
|
||||||
|
$form-label-font-size: $font-size-sm;
|
||||||
|
|
||||||
|
$form-check-input-border: 1px solid $hd-border-2;
|
||||||
|
$form-check-input-checked-bg-color: $hd-green-500;
|
||||||
|
$form-check-input-focus-box-shadow: $focus-ring-box-shadow;
|
||||||
|
|
||||||
|
// Cards
|
||||||
|
$card-border-color: $hd-border-1;
|
||||||
|
$card-border-radius: $border-radius-lg;
|
||||||
|
$card-inner-border-radius: subtract($card-border-radius, 1px);
|
||||||
|
$card-cap-bg: $hd-bg-subtle;
|
||||||
|
$card-cap-color: $hd-fg-1;
|
||||||
|
$card-bg: $hd-bg-canvas;
|
||||||
|
$card-box-shadow: none;
|
||||||
|
$card-spacer-y: 1rem;
|
||||||
|
$card-spacer-x: 1.25rem;
|
||||||
|
|
||||||
|
// Navbar
|
||||||
|
$navbar-padding-y: 0.75rem;
|
||||||
|
$navbar-light-color: $hd-fg-2;
|
||||||
|
$navbar-light-hover-color: $hd-fg-1;
|
||||||
|
$navbar-light-active-color: $hd-green-700;
|
||||||
|
$navbar-light-brand-color: $hd-fg-1;
|
||||||
|
$navbar-light-brand-hover-color: $hd-fg-1;
|
||||||
|
|
||||||
|
// Dropdowns
|
||||||
|
$dropdown-bg: $hd-bg-canvas;
|
||||||
|
$dropdown-border-color: $hd-border-1;
|
||||||
|
$dropdown-border-radius: $border-radius-lg;
|
||||||
|
$dropdown-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
|
||||||
|
$dropdown-link-hover-bg: $hd-bg-subtle;
|
||||||
|
$dropdown-link-active-bg: $hd-green-50;
|
||||||
|
$dropdown-link-active-color: $hd-green-700;
|
||||||
|
|
||||||
|
// Modals
|
||||||
|
$modal-content-bg: $hd-bg-canvas;
|
||||||
|
$modal-content-border-color: $hd-border-1;
|
||||||
|
$modal-content-border-radius: $border-radius-xl;
|
||||||
|
$modal-content-box-shadow-xs: 0 8px 24px rgba(0, 0, 0, 0.08);
|
||||||
|
$modal-content-box-shadow-sm-up: 0 16px 48px rgba(0, 0, 0, 0.12);
|
||||||
|
$modal-backdrop-bg: #0a0a0b;
|
||||||
|
$modal-backdrop-opacity: 0.4;
|
||||||
|
|
||||||
|
// Alerts
|
||||||
|
$alert-border-radius: $border-radius;
|
||||||
|
$alert-border-width: 1px;
|
||||||
|
$alert-padding-y: 0.75rem;
|
||||||
|
$alert-padding-x: 1rem;
|
||||||
|
|
||||||
|
// Badges
|
||||||
|
$badge-font-size: 0.75em;
|
||||||
|
$badge-font-weight: 600;
|
||||||
|
$badge-padding-y: 0.25em;
|
||||||
|
$badge-padding-x: 0.5em;
|
||||||
|
$badge-border-radius: $border-radius-sm;
|
||||||
|
|
||||||
|
// Tables
|
||||||
|
$table-border-color: $hd-border-1;
|
||||||
|
$table-striped-bg: $hd-bg-subtle;
|
||||||
|
$table-hover-bg: $hd-bg-subtle;
|
||||||
|
$table-color: $hd-fg-2;
|
||||||
|
|
||||||
|
// Code
|
||||||
|
$code-color: $hd-green-700;
|
||||||
|
$code-font-size: 0.9em;
|
||||||
|
$kbd-bg: $hd-fg-1;
|
||||||
|
$pre-color: $hd-fg-2;
|
||||||
|
|
||||||
|
// Tooltip / popover
|
||||||
|
$tooltip-bg: $hd-fg-1;
|
||||||
|
$tooltip-color: $hd-bg-canvas;
|
||||||
|
$tooltip-border-radius: $border-radius-sm;
|
||||||
|
$tooltip-font-size: $font-size-sm;
|
||||||
|
$popover-bg: $hd-bg-canvas;
|
||||||
|
$popover-border-color: $hd-border-1;
|
||||||
|
$popover-border-radius: $border-radius-lg;
|
||||||
|
$popover-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 4. BOOTSTRAP IMPORT
|
||||||
|
// Adjust this path to your `bootstrap/scss/` location.
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
@import "bootstrap/scss/functions";
|
||||||
|
@import "bootstrap/scss/variables";
|
||||||
|
@import "bootstrap/scss/variables-dark";
|
||||||
|
@import "bootstrap/scss/maps";
|
||||||
|
@import "bootstrap/scss/mixins";
|
||||||
|
@import "bootstrap/scss/utilities";
|
||||||
|
|
||||||
|
// Extend $theme-colors with our custom slots
|
||||||
|
$theme-colors: map-merge($theme-colors, $custom-theme-colors);
|
||||||
|
|
||||||
|
// Now pull the rest of Bootstrap in
|
||||||
|
@import "bootstrap/scss/root";
|
||||||
|
@import "bootstrap/scss/reboot";
|
||||||
|
@import "bootstrap/scss/type";
|
||||||
|
@import "bootstrap/scss/images";
|
||||||
|
@import "bootstrap/scss/containers";
|
||||||
|
@import "bootstrap/scss/grid";
|
||||||
|
@import "bootstrap/scss/tables";
|
||||||
|
@import "bootstrap/scss/forms";
|
||||||
|
@import "bootstrap/scss/buttons";
|
||||||
|
@import "bootstrap/scss/transitions";
|
||||||
|
@import "bootstrap/scss/dropdown";
|
||||||
|
@import "bootstrap/scss/button-group";
|
||||||
|
@import "bootstrap/scss/nav";
|
||||||
|
@import "bootstrap/scss/navbar";
|
||||||
|
@import "bootstrap/scss/card";
|
||||||
|
@import "bootstrap/scss/accordion";
|
||||||
|
@import "bootstrap/scss/breadcrumb";
|
||||||
|
@import "bootstrap/scss/pagination";
|
||||||
|
@import "bootstrap/scss/badge";
|
||||||
|
@import "bootstrap/scss/alert";
|
||||||
|
@import "bootstrap/scss/progress";
|
||||||
|
@import "bootstrap/scss/list-group";
|
||||||
|
@import "bootstrap/scss/close";
|
||||||
|
@import "bootstrap/scss/toasts";
|
||||||
|
@import "bootstrap/scss/modal";
|
||||||
|
@import "bootstrap/scss/tooltip";
|
||||||
|
@import "bootstrap/scss/popover";
|
||||||
|
@import "bootstrap/scss/carousel";
|
||||||
|
@import "bootstrap/scss/spinners";
|
||||||
|
@import "bootstrap/scss/offcanvas";
|
||||||
|
@import "bootstrap/scss/placeholders";
|
||||||
|
@import "bootstrap/scss/helpers";
|
||||||
|
@import "bootstrap/scss/utilities/api";
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 5. happyDomain CSS CUSTOM PROPERTIES
|
||||||
|
// Exposed alongside Bootstrap's so existing `--hd-*` references keep working.
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
:root,
|
||||||
|
[data-bs-theme="light"] {
|
||||||
|
// Plum ramp
|
||||||
|
--hd-plum-50: #{$hd-plum-50};
|
||||||
|
--hd-plum-100: #{$hd-plum-100};
|
||||||
|
--hd-plum-200: #{$hd-plum-200};
|
||||||
|
--hd-plum-300: #{$hd-plum-300};
|
||||||
|
--hd-plum-400: #{$hd-plum-400};
|
||||||
|
--hd-plum-500: #{$hd-plum-500};
|
||||||
|
--hd-plum-600: #{$hd-plum-600};
|
||||||
|
--hd-plum-700: #{$hd-plum-700};
|
||||||
|
--hd-plum-800: #{$hd-plum-800};
|
||||||
|
--hd-plum-900: #{$hd-plum-900};
|
||||||
|
|
||||||
|
// Brand dark roles
|
||||||
|
--hd-brand-dark: #{$hd-brand-dark};
|
||||||
|
--hd-brand-dark-hover: #{$hd-brand-dark-hover};
|
||||||
|
--hd-brand-dark-fg: #{$hd-brand-dark-fg};
|
||||||
|
--hd-brand-dark-muted: #{$hd-brand-dark-muted};
|
||||||
|
--hd-brand-dark-border: #{$hd-brand-dark-border};
|
||||||
|
--hd-brand-dark-subtle: #{$hd-brand-dark-subtle};
|
||||||
|
|
||||||
|
// Brand ramp
|
||||||
|
--hd-green-50: #{$hd-green-50};
|
||||||
|
--hd-green-100: #{$hd-green-100};
|
||||||
|
--hd-green-200: #{$hd-green-200};
|
||||||
|
--hd-green-300: #{$hd-green-300};
|
||||||
|
--hd-green-400: #{$hd-green-400};
|
||||||
|
--hd-green-500: #{$hd-green-500};
|
||||||
|
--hd-green-600: #{$hd-green-600};
|
||||||
|
--hd-green-700: #{$hd-green-700};
|
||||||
|
--hd-green-800: #{$hd-green-800};
|
||||||
|
--hd-green-900: #{$hd-green-900};
|
||||||
|
|
||||||
|
// Surfaces
|
||||||
|
--hd-bg-canvas: #{$hd-bg-canvas};
|
||||||
|
--hd-bg-default: #{$hd-bg-default};
|
||||||
|
--hd-bg-subtle: #{$hd-bg-subtle};
|
||||||
|
--hd-bg-inset: #{$hd-bg-inset};
|
||||||
|
--hd-bg-overlay: rgba(0, 0, 0, 0.04);
|
||||||
|
|
||||||
|
// Foreground
|
||||||
|
--hd-fg-1: #{$hd-fg-1};
|
||||||
|
--hd-fg-2: #{$hd-fg-2};
|
||||||
|
--hd-fg-3: #{$hd-fg-3};
|
||||||
|
--hd-fg-4: #{$hd-fg-4};
|
||||||
|
--hd-fg-inverse: #ffffff;
|
||||||
|
|
||||||
|
// Borders
|
||||||
|
--hd-border-1: #{$hd-border-1};
|
||||||
|
--hd-border-2: #{$hd-border-2};
|
||||||
|
--hd-border-3: #{$hd-border-3};
|
||||||
|
|
||||||
|
// Accent
|
||||||
|
--hd-accent: #{$hd-green-500};
|
||||||
|
--hd-accent-hover: #{$hd-green-600};
|
||||||
|
--hd-accent-fg: #ffffff;
|
||||||
|
--hd-accent-subtle: #{$hd-green-50};
|
||||||
|
--hd-accent-muted: #{$hd-green-100};
|
||||||
|
--hd-accent-border: #{$hd-green-200};
|
||||||
|
--hd-focus-ring: #{$hd-focus-ring};
|
||||||
|
|
||||||
|
// Semantic
|
||||||
|
--hd-success: #{$hd-success};
|
||||||
|
--hd-success-bg: #{$hd-success-bg};
|
||||||
|
--hd-danger: #{$hd-danger};
|
||||||
|
--hd-danger-bg: #{$hd-danger-bg};
|
||||||
|
--hd-warning: #{$hd-warning};
|
||||||
|
--hd-warning-bg: #{$hd-warning-bg};
|
||||||
|
--hd-info: #{$hd-info};
|
||||||
|
--hd-info-bg: #{$hd-info-bg};
|
||||||
|
|
||||||
|
// DNS diff
|
||||||
|
--hd-diff-add: #{$hd-green-500};
|
||||||
|
--hd-diff-add-bg: #{$hd-green-50};
|
||||||
|
--hd-diff-add-line: #{$hd-green-100};
|
||||||
|
--hd-diff-del: #{$hd-danger};
|
||||||
|
--hd-diff-del-bg: #{$hd-danger-bg};
|
||||||
|
--hd-diff-del-line: #ffd6d8;
|
||||||
|
--hd-diff-mod: #{$hd-warning};
|
||||||
|
--hd-diff-mod-bg: #{$hd-warning-bg};
|
||||||
|
|
||||||
|
// Fonts
|
||||||
|
--hd-font-brand: "Quicksand Variable", "Quicksand", sans-serif;
|
||||||
|
--hd-font-ui: "DM Sans", system-ui, -apple-system, sans-serif;
|
||||||
|
--hd-font-mono: "DM Mono", "SFMono-Regular", Consolas, monospace;
|
||||||
|
|
||||||
|
// Radii
|
||||||
|
--hd-radius-none: 0;
|
||||||
|
--hd-radius-xs: 2px;
|
||||||
|
--hd-radius-sm: 4px;
|
||||||
|
--hd-radius: 6px;
|
||||||
|
--hd-radius-md: 8px;
|
||||||
|
--hd-radius-lg: 12px;
|
||||||
|
--hd-radius-full: 9999px;
|
||||||
|
|
||||||
|
// Shadows
|
||||||
|
--hd-shadow-none: none;
|
||||||
|
--hd-shadow-focus: 0 0 0 3px var(--hd-focus-ring);
|
||||||
|
--hd-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 6. DARK MODE (Bootstrap 5.3 `data-bs-theme="dark"`)
|
||||||
|
// Mirrors the dark-mode block in colors_and_type.css.
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] {
|
||||||
|
// Bootstrap CSS vars
|
||||||
|
--bs-body-bg: #111514; // content default (green-tinted surfaces unchanged)
|
||||||
|
--bs-body-bg-rgb: 17, 21, 20;
|
||||||
|
--bs-body-color: #b8c4bf;
|
||||||
|
--bs-body-color-rgb: 184, 196, 191;
|
||||||
|
--bs-emphasis-color: #f4f7f6;
|
||||||
|
--bs-secondary-color: #7a9189;
|
||||||
|
--bs-secondary-bg: #181d1b;
|
||||||
|
--bs-tertiary-color: #4a5e58;
|
||||||
|
--bs-tertiary-bg: #1e2422;
|
||||||
|
--bs-dark: #f4f7f6;
|
||||||
|
--bs-dark-rgb: 244, 247, 246;
|
||||||
|
--bs-light: #1e2422;
|
||||||
|
--bs-light-rgb: 30, 36, 34;
|
||||||
|
|
||||||
|
--bs-border-color: #1f2c27;
|
||||||
|
--bs-border-color-translucent: rgba(255, 255, 255, 0.1);
|
||||||
|
--bs-link-color: #22d3a3;
|
||||||
|
--bs-link-color-rgb: 34, 211, 163;
|
||||||
|
--bs-link-hover-color: #56c8a4;
|
||||||
|
--bs-code-color: #56c8a4;
|
||||||
|
--bs-primary: #22d3a3;
|
||||||
|
--bs-primary-rgb: 34, 211, 163;
|
||||||
|
--bs-primary-bg-subtle: #0d2a22;
|
||||||
|
--bs-primary-border-subtle: #1a5c47;
|
||||||
|
--bs-primary-text-emphasis: #56c8a4;
|
||||||
|
--bs-success: #22d3a3;
|
||||||
|
--bs-success-rgb: 34, 211, 163;
|
||||||
|
--bs-success-bg-subtle: #0d2a22;
|
||||||
|
--bs-danger: #f87171;
|
||||||
|
--bs-danger-rgb: 248, 113, 113;
|
||||||
|
--bs-danger-bg-subtle: #2a1010;
|
||||||
|
--bs-warning: #fbbf24;
|
||||||
|
--bs-warning-rgb: 251, 191, 36;
|
||||||
|
--bs-warning-bg-subtle: #2a1f00;
|
||||||
|
--bs-info: #38bdf8;
|
||||||
|
--bs-info-rgb: 56, 189, 248;
|
||||||
|
--bs-info-bg-subtle: #0c1e2a;
|
||||||
|
|
||||||
|
// happyDomain CSS vars
|
||||||
|
--hd-bg-canvas: #{$hd-bg-canvas-dark}; // plum-tinted, replaces green #0c0f0e
|
||||||
|
--hd-bg-default: #111514;
|
||||||
|
--hd-bg-subtle: #181d1b;
|
||||||
|
--hd-bg-inset: #1e2422;
|
||||||
|
--hd-bg-overlay: rgba(255, 255, 255, 0.04);
|
||||||
|
|
||||||
|
--hd-fg-1: #f4f7f6;
|
||||||
|
--hd-fg-2: #b8c4bf;
|
||||||
|
--hd-fg-3: #7a9189;
|
||||||
|
--hd-fg-4: #4a5e58;
|
||||||
|
--hd-fg-inverse: #0c0f0e;
|
||||||
|
|
||||||
|
--hd-border-1: #1f2c27;
|
||||||
|
--hd-border-2: #293c36;
|
||||||
|
--hd-border-3: #3a5249;
|
||||||
|
|
||||||
|
--hd-accent: #22d3a3;
|
||||||
|
--hd-accent-hover: #1cb487;
|
||||||
|
--hd-accent-fg: #0c0f0e;
|
||||||
|
--hd-accent-subtle: #0d2a22;
|
||||||
|
--hd-accent-muted: #0f3329;
|
||||||
|
--hd-accent-border: #1a5c47;
|
||||||
|
--hd-focus-ring: rgba(34, 211, 163, 0.25);
|
||||||
|
|
||||||
|
--hd-success: #22d3a3;
|
||||||
|
--hd-success-bg: #0d2a22;
|
||||||
|
--hd-danger: #f87171;
|
||||||
|
--hd-danger-bg: #2a1010;
|
||||||
|
--hd-warning: #fbbf24;
|
||||||
|
--hd-warning-bg: #2a1f00;
|
||||||
|
--hd-info: #38bdf8;
|
||||||
|
--hd-info-bg: #0c1e2a;
|
||||||
|
|
||||||
|
--hd-diff-add: #22d3a3;
|
||||||
|
--hd-diff-add-bg: #0d2a22;
|
||||||
|
--hd-diff-add-line: #0f3329;
|
||||||
|
--hd-diff-del: #f87171;
|
||||||
|
--hd-diff-del-bg: #2a1010;
|
||||||
|
--hd-diff-del-line: #3a1515;
|
||||||
|
--hd-diff-mod: #fbbf24;
|
||||||
|
--hd-diff-mod-bg: #2a1f00;
|
||||||
|
|
||||||
|
--hd-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .form-switch .form-check-input:not(:checked):not(:focus) {
|
||||||
|
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255%2C255%2C255%2C.25%29'/%3e%3c/svg%3e");
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .modal-content {
|
||||||
|
--bs-modal-bg: var(--hd-bg-canvas);
|
||||||
|
--bs-modal-color: var(--hd-fg-2);
|
||||||
|
--bs-modal-border-color: var(--hd-border-1);
|
||||||
|
--bs-modal-header-border-color: var(--hd-border-1);
|
||||||
|
--bs-modal-footer-border-color: var(--hd-border-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .table {
|
||||||
|
--bs-table-color: var(--hd-fg-2);
|
||||||
|
--bs-table-bg: transparent;
|
||||||
|
--bs-table-border-color: var(--hd-border-1);
|
||||||
|
--bs-table-striped-color: var(--hd-fg-2);
|
||||||
|
--bs-table-striped-bg: rgba(255, 255, 255, 0.03);
|
||||||
|
--bs-table-hover-color: var(--hd-fg-1);
|
||||||
|
--bs-table-hover-bg: rgba(255, 255, 255, 0.04);
|
||||||
|
--bs-table-active-bg: rgba(255, 255, 255, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 7. COMPONENT REFINEMENTS — small tweaks to align Bootstrap with the system
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Use brand font for `.display-*` headings
|
||||||
|
.display-1,
|
||||||
|
.display-2,
|
||||||
|
.display-3,
|
||||||
|
.display-4,
|
||||||
|
.display-5,
|
||||||
|
.display-6 {
|
||||||
|
font-family: var(--hd-font-brand);
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tighten button hover — flat system, no shadow lift
|
||||||
|
.btn-primary,
|
||||||
|
.btn-success {
|
||||||
|
--bs-btn-bg: var(--hd-accent);
|
||||||
|
--bs-btn-border-color: var(--hd-accent);
|
||||||
|
--bs-btn-hover-bg: var(--hd-accent-hover);
|
||||||
|
--bs-btn-hover-border-color: var(--hd-accent-hover);
|
||||||
|
--bs-btn-active-bg: var(--hd-accent-hover);
|
||||||
|
--bs-btn-active-border-color: var(--hd-accent-hover);
|
||||||
|
--bs-btn-color: var(--hd-accent-fg);
|
||||||
|
--bs-btn-hover-color: var(--hd-accent-fg);
|
||||||
|
--bs-btn-active-color: var(--hd-accent-fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-primary {
|
||||||
|
--bs-btn-color: var(--hd-accent);
|
||||||
|
--bs-btn-border-color: var(--hd-accent-border);
|
||||||
|
--bs-btn-hover-bg: var(--hd-accent-subtle);
|
||||||
|
--bs-btn-hover-border-color: var(--hd-accent);
|
||||||
|
--bs-btn-hover-color: var(--hd-accent-hover);
|
||||||
|
--bs-btn-active-bg: var(--hd-accent);
|
||||||
|
--bs-btn-active-border-color: var(--hd-accent);
|
||||||
|
--bs-btn-active-color: var(--hd-accent-fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inputs: subtle inset, focus ring uses brand
|
||||||
|
.form-control,
|
||||||
|
.form-select {
|
||||||
|
background-color: var(--hd-bg-canvas);
|
||||||
|
border-color: var(--hd-border-1);
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
&:focus {
|
||||||
|
background-color: var(--hd-bg-canvas);
|
||||||
|
border-color: var(--hd-accent);
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
box-shadow: 0 0 0 3px var(--hd-focus-ring);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group-text {
|
||||||
|
background-color: var(--hd-bg-subtle);
|
||||||
|
border-color: var(--hd-border-1);
|
||||||
|
color: var(--hd-fg-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Card: flat, 1px border separation
|
||||||
|
.card {
|
||||||
|
--bs-card-bg: var(--hd-bg-canvas);
|
||||||
|
--bs-card-border-color: var(--hd-border-1);
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .offcanvas,
|
||||||
|
[data-bs-theme="dark"] .offcanvas-sm,
|
||||||
|
[data-bs-theme="dark"] .offcanvas-md,
|
||||||
|
[data-bs-theme="dark"] .offcanvas-lg,
|
||||||
|
[data-bs-theme="dark"] .offcanvas-xl,
|
||||||
|
[data-bs-theme="dark"] .offcanvas-xxl {
|
||||||
|
--bs-offcanvas-bg: var(--hd-bg-subtle);
|
||||||
|
--bs-offcanvas-border-color: var(--hd-border-1);
|
||||||
|
--bs-offcanvas-color: var(--hd-fg-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .dropdown-menu {
|
||||||
|
--bs-dropdown-bg: var(--hd-bg-subtle);
|
||||||
|
--bs-dropdown-border-color: var(--hd-border-1);
|
||||||
|
--bs-dropdown-color: var(--hd-fg-2);
|
||||||
|
--bs-dropdown-link-color: var(--hd-fg-2);
|
||||||
|
--bs-dropdown-link-hover-bg: var(--hd-bg-inset);
|
||||||
|
--bs-dropdown-link-hover-color: var(--hd-fg-1);
|
||||||
|
--bs-dropdown-link-active-bg: var(--hd-accent-subtle);
|
||||||
|
--bs-dropdown-link-active-color: var(--hd-accent);
|
||||||
|
--bs-dropdown-divider-bg: var(--hd-border-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .card {
|
||||||
|
--bs-card-bg: var(--hd-bg-canvas);
|
||||||
|
--bs-card-cap-bg: var(--hd-bg-default);
|
||||||
|
--bs-card-cap-color: var(--hd-fg-1);
|
||||||
|
--bs-card-color: var(--hd-fg-2);
|
||||||
|
--bs-card-border-color: var(--hd-border-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alerts: tint background + colored border to match diff/semantic system
|
||||||
|
.alert-success {
|
||||||
|
background-color: var(--hd-success-bg);
|
||||||
|
border-color: var(--hd-accent-border);
|
||||||
|
color: #0d6651;
|
||||||
|
}
|
||||||
|
.alert-danger {
|
||||||
|
background-color: var(--hd-danger-bg);
|
||||||
|
border-color: var(--hd-diff-del-line);
|
||||||
|
color: #9b2c2f;
|
||||||
|
}
|
||||||
|
.alert-warning {
|
||||||
|
background-color: var(--hd-warning-bg);
|
||||||
|
border-color: #fcd34d;
|
||||||
|
color: #92400e;
|
||||||
|
}
|
||||||
|
.alert-info {
|
||||||
|
background-color: var(--hd-info-bg);
|
||||||
|
border-color: #bae6fd;
|
||||||
|
color: #075985;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] {
|
||||||
|
.btn-light {
|
||||||
|
--bs-btn-bg: var(--hd-bg-inset);
|
||||||
|
--bs-btn-border-color: var(--hd-border-2);
|
||||||
|
--bs-btn-color: var(--hd-fg-1);
|
||||||
|
--bs-btn-hover-bg: var(--hd-bg-subtle);
|
||||||
|
--bs-btn-hover-border-color: var(--hd-border-1);
|
||||||
|
--bs-btn-hover-color: var(--hd-fg-1);
|
||||||
|
--bs-btn-active-bg: var(--hd-bg-default);
|
||||||
|
--bs-btn-active-border-color: var(--hd-border-1);
|
||||||
|
--bs-btn-active-color: var(--hd-fg-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-dark {
|
||||||
|
--bs-btn-bg: var(--hd-fg-1);
|
||||||
|
--bs-btn-border-color: var(--hd-fg-1);
|
||||||
|
--bs-btn-color: var(--hd-fg-inverse);
|
||||||
|
--bs-btn-hover-bg: var(--hd-fg-2);
|
||||||
|
--bs-btn-hover-border-color: var(--hd-fg-2);
|
||||||
|
--bs-btn-hover-color: var(--hd-fg-inverse);
|
||||||
|
--bs-btn-active-bg: var(--hd-fg-2);
|
||||||
|
--bs-btn-active-border-color: var(--hd-fg-2);
|
||||||
|
--bs-btn-active-color: var(--hd-fg-inverse);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-success {
|
||||||
|
color: var(--hd-success);
|
||||||
|
border-color: var(--hd-accent-border);
|
||||||
|
}
|
||||||
|
.alert-danger {
|
||||||
|
color: var(--hd-danger);
|
||||||
|
border-color: var(--hd-diff-del-line);
|
||||||
|
}
|
||||||
|
.alert-warning {
|
||||||
|
color: var(--hd-warning);
|
||||||
|
border-color: rgba(251, 191, 36, 0.4);
|
||||||
|
}
|
||||||
|
.alert-info {
|
||||||
|
color: var(--hd-info);
|
||||||
|
border-color: rgba(56, 189, 248, 0.35);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code styling
|
||||||
|
code,
|
||||||
|
.hd-code {
|
||||||
|
font-family: var(--hd-font-mono);
|
||||||
|
background: var(--hd-bg-subtle);
|
||||||
|
border: 1px solid var(--hd-border-1);
|
||||||
|
border-radius: var(--hd-radius-xs);
|
||||||
|
padding: 0.1em 0.35em;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Focus visibility — system-wide
|
||||||
|
:focus-visible {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: var(--hd-shadow-focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brand-dark surface — hero blocks, inverse cards, marketing slabs, quote panels
|
||||||
|
.hd-brand-dark-surface {
|
||||||
|
background-color: var(--hd-brand-dark);
|
||||||
|
color: var(--hd-brand-dark-fg);
|
||||||
|
|
||||||
|
// Eyebrows, labels, secondary copy inside a plum surface
|
||||||
|
.hd-muted,
|
||||||
|
.text-muted,
|
||||||
|
small {
|
||||||
|
color: var(--hd-brand-dark-muted) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dividers within the surface
|
||||||
|
hr,
|
||||||
|
.hd-divider {
|
||||||
|
border-color: var(--hd-brand-dark-border);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Green CTA on plum background — the accent sings here
|
||||||
|
.btn-primary,
|
||||||
|
.btn-success,
|
||||||
|
.btn-accent {
|
||||||
|
--bs-btn-bg: var(--hd-accent);
|
||||||
|
--bs-btn-border-color: var(--hd-accent);
|
||||||
|
--bs-btn-hover-bg: var(--hd-accent-hover);
|
||||||
|
--bs-btn-hover-border-color: var(--hd-accent-hover);
|
||||||
|
--bs-btn-color: var(--hd-accent-fg);
|
||||||
|
--bs-btn-hover-color: var(--hd-accent-fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--hd-brand-dark-hover);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Subtle plum callout — quote blocks, testimonials, light-page accents
|
||||||
|
.hd-brand-subtle-surface {
|
||||||
|
background-color: var(--hd-brand-dark-subtle);
|
||||||
|
border: 1px solid #{$hd-plum-100};
|
||||||
|
border-radius: var(--hd-radius-md);
|
||||||
|
|
||||||
|
.hd-eyebrow,
|
||||||
|
.hd-label {
|
||||||
|
color: #{$hd-plum-500};
|
||||||
|
}
|
||||||
|
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4 {
|
||||||
|
color: #{$hd-plum-800};
|
||||||
|
}
|
||||||
|
|
||||||
|
p,
|
||||||
|
.hd-body {
|
||||||
|
color: #{$hd-plum-600};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 8. BRAND TYPOGRAPHY UTILITIES (parity with colors_and_type.css)
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
.hd-display {
|
||||||
|
font-family: var(--hd-font-brand);
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.2;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
}
|
||||||
|
.hd-h1 {
|
||||||
|
font-family: var(--hd-font-ui);
|
||||||
|
font-size: 2.25rem;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.2;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
}
|
||||||
|
.hd-h2 {
|
||||||
|
font-family: var(--hd-font-ui);
|
||||||
|
font-size: 1.875rem;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.2;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
}
|
||||||
|
.hd-h3 {
|
||||||
|
font-family: var(--hd-font-ui);
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.375;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
}
|
||||||
|
.hd-body {
|
||||||
|
font-family: var(--hd-font-ui);
|
||||||
|
font-size: 0.9375rem;
|
||||||
|
line-height: 1.625;
|
||||||
|
color: var(--hd-fg-2);
|
||||||
|
}
|
||||||
|
.hd-small {
|
||||||
|
font-family: var(--hd-font-ui);
|
||||||
|
font-size: 0.8125rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
}
|
||||||
|
.hd-label {
|
||||||
|
font-family: var(--hd-font-ui);
|
||||||
|
font-size: 0.6875rem;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
}
|
||||||
|
.hd-mono {
|
||||||
|
font-family: var(--hd-font-mono);
|
||||||
|
font-size: 0.8125rem;
|
||||||
|
line-height: 1.625;
|
||||||
|
color: var(--hd-fg-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// 9. DNS DIFF UTILITIES — happyDomain-specific
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
.hd-diff-add {
|
||||||
|
background: var(--hd-diff-add-bg);
|
||||||
|
border-left: 3px solid var(--hd-diff-add);
|
||||||
|
color: var(--hd-diff-add);
|
||||||
|
}
|
||||||
|
.hd-diff-del {
|
||||||
|
background: var(--hd-diff-del-bg);
|
||||||
|
border-left: 3px solid var(--hd-diff-del);
|
||||||
|
color: var(--hd-diff-del);
|
||||||
|
}
|
||||||
|
.hd-diff-mod {
|
||||||
|
background: var(--hd-diff-mod-bg);
|
||||||
|
border-left: 3px solid var(--hd-diff-mod);
|
||||||
|
color: var(--hd-diff-mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plum text-bg helper (Bootstrap doesn't generate this for custom theme colors)
|
||||||
|
.text-bg-plum {
|
||||||
|
color: color-contrast($hd-plum-500) !important;
|
||||||
|
background-color: $hd-plum-500 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DNS record-type chip (e.g. A, AAAA, MX, TXT, CNAME)
|
||||||
|
.hd-record-type {
|
||||||
|
display: inline-block;
|
||||||
|
font-family: var(--hd-font-mono);
|
||||||
|
font-size: 0.6875rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
padding: 0.15em 0.45em;
|
||||||
|
border-radius: var(--hd-radius-sm);
|
||||||
|
background: var(--hd-bg-inset);
|
||||||
|
color: var(--hd-fg-2);
|
||||||
|
border: 1px solid var(--hd-border-1);
|
||||||
|
}
|
||||||
45
config.yml
45
config.yml
|
|
@ -34,14 +34,12 @@ languages:
|
||||||
DefaultDescription: "L'interface qui vous rend heureux de gérer vos noms de domaines."
|
DefaultDescription: "L'interface qui vous rend heureux de gérer vos noms de domaines."
|
||||||
|
|
||||||
others_links:
|
others_links:
|
||||||
- text: "S'inscrire"
|
|
||||||
href: "//app.happydomain.org/register"
|
|
||||||
class: "btn btn-secondary"
|
|
||||||
icon: "bi-person-plus-fill"
|
|
||||||
- text: "S'identifier"
|
- text: "S'identifier"
|
||||||
href: "//app.happydomain.org/login"
|
href: "//app.happydomain.org/login"
|
||||||
class: "btn btn-outline-primary"
|
class: "btn btn-link text-dark"
|
||||||
icon: "bi-person-check-fill"
|
- text: "Essayer en ligne →"
|
||||||
|
href: "//try.happydomain.org/"
|
||||||
|
class: "btn btn-primary btn-sm"
|
||||||
|
|
||||||
carousel:
|
carousel:
|
||||||
- title: "domains-lists"
|
- title: "domains-lists"
|
||||||
|
|
@ -90,14 +88,12 @@ params:
|
||||||
tryit: "https://try.happydomain.org/"
|
tryit: "https://try.happydomain.org/"
|
||||||
|
|
||||||
others_links:
|
others_links:
|
||||||
- text: "Sign up"
|
|
||||||
href: "//app.happydomain.org/register"
|
|
||||||
class: "btn btn-secondary"
|
|
||||||
icon: "bi-person-plus-fill"
|
|
||||||
- text: "Sign in"
|
- text: "Sign in"
|
||||||
href: "//app.happydomain.org/login"
|
href: "//app.happydomain.org/login"
|
||||||
class: "btn btn-outline-primary"
|
class: "btn btn-link text-dark"
|
||||||
icon: "bi-person-check-fill"
|
- text: "Try it online →"
|
||||||
|
href: "//try.happydomain.org/"
|
||||||
|
class: "btn btn-primary btn-sm"
|
||||||
|
|
||||||
carousel:
|
carousel:
|
||||||
- title: "domains-lists"
|
- title: "domains-lists"
|
||||||
|
|
@ -153,6 +149,31 @@ menu:
|
||||||
url: "https://blog.happydomain.org/"
|
url: "https://blog.happydomain.org/"
|
||||||
weight: 30
|
weight: 30
|
||||||
|
|
||||||
|
module:
|
||||||
|
mounts:
|
||||||
|
- source: content
|
||||||
|
target: content
|
||||||
|
- source: static
|
||||||
|
target: static
|
||||||
|
- source: layouts
|
||||||
|
target: layouts
|
||||||
|
- source: data
|
||||||
|
target: data
|
||||||
|
- source: assets
|
||||||
|
target: assets
|
||||||
|
- source: i18n
|
||||||
|
target: i18n
|
||||||
|
- source: archetypes
|
||||||
|
target: archetypes
|
||||||
|
- source: node_modules/@fontsource-variable/hanken-grotesk
|
||||||
|
target: static/fonts/hanken-grotesk
|
||||||
|
- source: node_modules/@fontsource-variable/jetbrains-mono
|
||||||
|
target: static/fonts/jetbrains-mono
|
||||||
|
- source: node_modules/@fontsource-variable/quicksand
|
||||||
|
target: static/fonts/quicksand
|
||||||
|
- source: node_modules/bootstrap/dist/js
|
||||||
|
target: static/js
|
||||||
|
|
||||||
markup:
|
markup:
|
||||||
goldmark:
|
goldmark:
|
||||||
renderer:
|
renderer:
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,12 @@ id = "registrar"
|
||||||
en = "Choose your provider"
|
en = "Choose your provider"
|
||||||
|
|
||||||
[features.title]
|
[features.title]
|
||||||
fr = "Gérer les zones hébergées chez des prestataires d'hébergement"
|
fr = "Gérer les zones de votre fournisseur de noms de domaine"
|
||||||
en = "Manage your zones hosted on hosting providers"
|
en = "Manage zones at your registrar"
|
||||||
|
|
||||||
[features.content]
|
[features.content]
|
||||||
fr = "happyDomain peut regrouper les domaines que vous possédez dans différents bureaux d'enregistrement. Nous supportons aujourd'hui plus de 55 fournisseurs tels que OVH, Gandi, DigitalOcean, ..."
|
fr = "Connectez OVH, Gandi, DigitalOcean, Cloudflare et plus de 50 autres. happyDomain lit, édite et synchronise les zones pour vous."
|
||||||
en = "happyDomain can group the domains you own in different registrars. We currently support 55+ providers like OVH, Gandi, DigitalOcean, ..."
|
en = "Connect OVH, Gandi, DigitalOcean, Cloudflare and 50+ more. happyDomain reads, edits and synchronizes their zones for you."
|
||||||
|
|
||||||
[features.link]
|
[features.link]
|
||||||
link = "https://app.happydomain.org/providers/features"
|
link = "https://app.happydomain.org/providers/features"
|
||||||
|
|
@ -32,16 +32,16 @@ id = "dynamicDNS"
|
||||||
[features.img]
|
[features.img]
|
||||||
src = "/img/screenshots/features/dyndns.png"
|
src = "/img/screenshots/features/dyndns.png"
|
||||||
[features.img.alt]
|
[features.img.alt]
|
||||||
fr = "Une interface au dessus de votre serveur existant"
|
fr = "Gérez votre propre serveur de noms"
|
||||||
en = "An interface on top of your existing server"
|
en = "Drive your own name server"
|
||||||
|
|
||||||
[features.title]
|
[features.title]
|
||||||
fr = "Gérer les zones de vos serveurs BIND, Knot, PowerDNS, ..."
|
fr = "Gérer les zones de vos serveurs BIND, Knot, PowerDNS, ..."
|
||||||
en = "Manage your zones backed by BIND, Knot, PowerDNS, ..."
|
en = "Manage your zones backed by BIND, Knot, PowerDNS, ..."
|
||||||
|
|
||||||
[features.content]
|
[features.content]
|
||||||
fr = "happyDomain peut s'utiliser comme interface au dessus d'un serveur faisant autorité. Il utilise pour cela le Dynamic DNS (RFC 2136), implémenté dans de nombreux serveurs."
|
fr = "Utilisez happyDomain comme interface conviviale devant BIND, Knot ou PowerDNS via le DNS dynamique (RFC 2136). Implémenté dans de nombreux serveurs faisant autorité."
|
||||||
en = "happyDomain can be used as an interface above an authoritative name server. It uses the Dynamic DNS (RFC 2136), implemented in many server software."
|
en = "Use happyDomain as a friendly UI in front of BIND, Knot or PowerDNS via Dynamic DNS (RFC 2136). Implemented in many authoritative servers."
|
||||||
|
|
||||||
[features.link]
|
[features.link]
|
||||||
link = "https://help.happydomain.org/fr/deploy/"
|
link = "https://help.happydomain.org/fr/deploy/"
|
||||||
|
|
@ -59,12 +59,12 @@ id = "diff"
|
||||||
en = "Sample diff"
|
en = "Sample diff"
|
||||||
|
|
||||||
[features.title]
|
[features.title]
|
||||||
fr = "Visualiser clairement les changements"
|
fr = "Visualiser chaque changement"
|
||||||
en = "Clearly visualize changes"
|
en = "Visualize every change"
|
||||||
|
|
||||||
[features.content]
|
[features.content]
|
||||||
fr = "Avant de publier vos modifications, happyDomain vous montre quels seront exactement les changements (ajouts, modifications, suppressions, ...) qui seront effectués sur la zone. C'est le bon moment pour se relire."
|
fr = "Avant de publier, vérifiez précisément quels enregistrements seront ajoutés, modifiés ou supprimés. Vous pouvez relire attentivement les changements avant d'appuyer sur le bouton."
|
||||||
en = "Before publishing your changes, happyDomain shows you exactly what changes (additions, modifications, deletions, ...) will be made to your zone. This is a good time to reread."
|
en = "Before publishing, see exactly which records will be added, modified or deleted. Read-through your zone before you press the button."
|
||||||
|
|
||||||
|
|
||||||
[[features]]
|
[[features]]
|
||||||
|
|
@ -77,8 +77,8 @@ id = "resolver"
|
||||||
en = "DNS Resolver"
|
en = "DNS Resolver"
|
||||||
|
|
||||||
[features.title]
|
[features.title]
|
||||||
fr = "Tester ou déboguer votre zone en ligne"
|
fr = "Tester et déboguer votre zone"
|
||||||
en = "Test or debug your zone online"
|
en = "Test & debug your zone"
|
||||||
|
|
||||||
[features.content]
|
[features.content]
|
||||||
fr = "happyDomain intégre un résolveur DNS simple d'utilisation, qui vous permet de vous connecter sans effort à une cinquantaine de résolveurs publics. Vous pouvez facilement voir la propagation de vos modifications."
|
fr = "happyDomain intégre un résolveur DNS simple d'utilisation, qui vous permet de vous connecter sans effort à une cinquantaine de résolveurs publics. Vous pouvez facilement voir la propagation de vos modifications."
|
||||||
|
|
@ -90,29 +90,6 @@ id = "resolver"
|
||||||
en = "I want to test this now!"
|
en = "I want to test this now!"
|
||||||
|
|
||||||
|
|
||||||
[[features]]
|
|
||||||
id = "rest"
|
|
||||||
|
|
||||||
[features.img]
|
|
||||||
src = "/img/screenshots/features/rest.png"
|
|
||||||
[features.img.alt]
|
|
||||||
fr = "API REST"
|
|
||||||
en = "REST API"
|
|
||||||
|
|
||||||
[features.title]
|
|
||||||
fr = "Utiliser happyDomain comme API REST"
|
|
||||||
en = "Use happyDomain as a API REST"
|
|
||||||
|
|
||||||
[features.content]
|
|
||||||
fr = "happyDomain expose une API REST que vous pouvez utiliser pour automatiser des tâches de création de sous-domaine à la volée, par exemple dans votre système de déploiement continu."
|
|
||||||
en = "happyDomain exposes a REST API that you can use to automate sub-domain creation tasks on the fly, for example in your continuous deployment system."
|
|
||||||
|
|
||||||
[features.link]
|
|
||||||
link = "https://app.happydomain.org/swagger/index.html"
|
|
||||||
fr = "Montrez-moi l'API !"
|
|
||||||
en = "Show me the API!"
|
|
||||||
|
|
||||||
|
|
||||||
[[features]]
|
[[features]]
|
||||||
id = "history"
|
id = "history"
|
||||||
|
|
||||||
|
|
@ -124,8 +101,31 @@ id = "history"
|
||||||
|
|
||||||
[features.title]
|
[features.title]
|
||||||
fr = "Garder une trace des modifications"
|
fr = "Garder une trace des modifications"
|
||||||
en = "Keeping track of changes"
|
en = "Versioned, undoable"
|
||||||
|
|
||||||
[features.content]
|
[features.content]
|
||||||
fr = "happyDomain ne se contente pas de vous montrer votre zone telle qu'elle est publiée. Chaque modification est enregistrée afin de garder un historique de vos changements. En cas de problème, revenez à une version précédente en 2 clics."
|
fr = "Chaque modification publiée est enregistrée. Revenez à n'importe quelle version précédente de votre zone en deux clics. Auditez qui a effectué quelles modifications."
|
||||||
en = "happyDomain doesn't just show you your zone as it is published. Every modification is saved to keep a history of your changes. In case of problem, go back to a previous version in 2 clicks."
|
en = "Every published change is saved. Roll back to any previous version of your zone in two clicks. Audit who did what."
|
||||||
|
|
||||||
|
|
||||||
|
[[features]]
|
||||||
|
id = "rest"
|
||||||
|
|
||||||
|
[features.img]
|
||||||
|
src = "/img/screenshots/features/rest.png"
|
||||||
|
[features.img.alt]
|
||||||
|
fr = "API REST"
|
||||||
|
en = "REST API"
|
||||||
|
|
||||||
|
[features.title]
|
||||||
|
fr = "API REST, scripter vos domaines"
|
||||||
|
en = "REST API, ready to script"
|
||||||
|
|
||||||
|
[features.content]
|
||||||
|
fr = "Automatisez la création de domaines à la volée : idéal pour le déploiement continu et la mise en place de locataires."
|
||||||
|
en = "Automate domain creation tasks on the fly: perfect for continuous deployment and tenant provisioning."
|
||||||
|
|
||||||
|
[features.link]
|
||||||
|
link = "https://app.happydomain.org/swagger/index.html"
|
||||||
|
fr = "Montrez-moi l'API !"
|
||||||
|
en = "Show me the API!"
|
||||||
|
|
|
||||||
28
i18n/en.yaml
28
i18n/en.yaml
|
|
@ -1,15 +1,16 @@
|
||||||
- id: slogan
|
- id: slogan
|
||||||
translation: |
|
translation: |
|
||||||
<span class="font-weight-bolder" style="color: var(--secondary-subtle)">All</span> your domains. <span class="font-weight-bolder" style="color: var(--secondary-subtle)">One</span> interface.
|
<span class="font-weight-bolder" style="color: var(--bs-primary)">All</span> your domains. <span class="font-weight-bolder" style="color: var(--bs-primary)">One</span> interface.
|
||||||
|
|
||||||
- id: lead
|
- id: lead
|
||||||
translation: "is a free web interface that brings all your domain names together in one simple space."
|
translation: |
|
||||||
|
brings every DNS zone you manage — across registrars, providers and self-hosted name servers — into one calm space, clearly organized by service.
|
||||||
|
|
||||||
- id: tryit
|
- id: tryit
|
||||||
translation: "Try it online now"
|
translation: "Try it online"
|
||||||
|
|
||||||
- id: downloadit
|
- id: downloadit
|
||||||
translation: "Download now"
|
translation: "Self-host it"
|
||||||
|
|
||||||
- id: learnhow
|
- id: learnhow
|
||||||
translation: "Learn how"
|
translation: "Learn how"
|
||||||
|
|
@ -44,12 +45,15 @@
|
||||||
- id: press-kit
|
- id: press-kit
|
||||||
translation: "Press Kit"
|
translation: "Press Kit"
|
||||||
|
|
||||||
- id: features-title
|
- id: features-eyebrow
|
||||||
translation: "Main features"
|
translation: "Main features"
|
||||||
|
|
||||||
|
- id: features-title
|
||||||
|
translation: "Everything DNS, calm and connected."
|
||||||
|
|
||||||
- id: features-lead
|
- id: features-lead
|
||||||
translation: |
|
translation: |
|
||||||
Find out how happyDomain can simplify your domain name management.
|
happyDomain works as a smart layer above your existing infrastructure: connecting to registrars, hosting providers and authoritative servers so you can manage them all from one place.
|
||||||
|
|
||||||
- id: features-grid-title
|
- id: features-grid-title
|
||||||
translation: What can happyDomain do for you today?
|
translation: What can happyDomain do for you today?
|
||||||
|
|
@ -199,6 +203,12 @@
|
||||||
- id: footer-us-button-link
|
- id: footer-us-button-link
|
||||||
translation: "/en/who-we-are/"
|
translation: "/en/who-we-are/"
|
||||||
|
|
||||||
|
- id: footer-tagline
|
||||||
|
translation: "Free, open-source DNS management. Propagating happiness, one domain at a time."
|
||||||
|
- id: footer-made-eu
|
||||||
|
translation: "Made with care in the EU"
|
||||||
|
- id: footer-product
|
||||||
|
translation: "Product"
|
||||||
- id: footer-happydomain-features
|
- id: footer-happydomain-features
|
||||||
translation: "Features"
|
translation: "Features"
|
||||||
- id: footer-happydomain-testimonials
|
- id: footer-happydomain-testimonials
|
||||||
|
|
@ -224,13 +234,17 @@
|
||||||
- id: footer-resources-faq
|
- id: footer-resources-faq
|
||||||
translation: "FAQ"
|
translation: "FAQ"
|
||||||
- id: footer-company
|
- id: footer-company
|
||||||
translation: "Our association"
|
translation: "Project"
|
||||||
- id: footer-company-about
|
- id: footer-company-about
|
||||||
translation: "About us"
|
translation: "About us"
|
||||||
|
- id: footer-company-license
|
||||||
|
translation: "License (AGPL)"
|
||||||
- id: footer-company-contact
|
- id: footer-company-contact
|
||||||
translation: "Contact"
|
translation: "Contact"
|
||||||
- id: footer-follow
|
- id: footer-follow
|
||||||
translation: "Follow us"
|
translation: "Follow us"
|
||||||
|
- id: footer-legal
|
||||||
|
translation: "Legal"
|
||||||
|
|
||||||
- id: cta-account-title
|
- id: cta-account-title
|
||||||
translation: "Ready to simplify your domain management?"
|
translation: "Ready to simplify your domain management?"
|
||||||
|
|
|
||||||
24
i18n/fr.yaml
24
i18n/fr.yaml
|
|
@ -1,15 +1,16 @@
|
||||||
- id: slogan
|
- id: slogan
|
||||||
translation: |
|
translation: |
|
||||||
<span class="font-weight-bolder" style="color: var(--secondary-subtle)">Tous</span> vos domaines. <span class="font-weight-bolder" style="color: var(--secondary-subtle)">Une</span> interface.
|
<span class="font-weight-bolder" style="color: var(--bs-primary)">Tous</span> vos domaines. <span class="font-weight-bolder" style="color: var(--bs-primary)">Une</span> interface.
|
||||||
|
|
||||||
- id: lead
|
- id: lead
|
||||||
translation: "est une interface web libre qui rassemble tous vos noms de domaine dans un endroit simple."
|
translation: |
|
||||||
|
rassemble toutes les zones DNS que vous gérez — qu'elles proviennent de bureaux d'enregistrement, de prestataires de cloud ou de serveurs de noms auto-hébergés — au sein d'un espace unique et clair, organisé clairement par service.
|
||||||
|
|
||||||
- id: tryit
|
- id: tryit
|
||||||
translation: "Essayer maintenant"
|
translation: "Essayer maintenant"
|
||||||
|
|
||||||
- id: downloadit
|
- id: downloadit
|
||||||
translation: "Télécharger"
|
translation: "Hébergez-le"
|
||||||
|
|
||||||
- id: learnhow
|
- id: learnhow
|
||||||
translation: "Découvrez comment"
|
translation: "Découvrez comment"
|
||||||
|
|
@ -44,9 +45,12 @@
|
||||||
- id: press-kit
|
- id: press-kit
|
||||||
translation: "Dossier de presse"
|
translation: "Dossier de presse"
|
||||||
|
|
||||||
- id: features-title
|
- id: features-eyebrow
|
||||||
translation: "Principales fonctionnalités"
|
translation: "Principales fonctionnalités"
|
||||||
|
|
||||||
|
- id: features-title
|
||||||
|
translation: "Tout le DNS, sereinement connecté."
|
||||||
|
|
||||||
- id: features-lead
|
- id: features-lead
|
||||||
translation: "Découvrez comment happyDomain peut faciliter la gestion de vos noms de domaine."
|
translation: "Découvrez comment happyDomain peut faciliter la gestion de vos noms de domaine."
|
||||||
|
|
||||||
|
|
@ -198,6 +202,12 @@
|
||||||
- id: footer-us-button-link
|
- id: footer-us-button-link
|
||||||
translation: "/fr/qui-sommes-nous/"
|
translation: "/fr/qui-sommes-nous/"
|
||||||
|
|
||||||
|
- id: footer-tagline
|
||||||
|
translation: "Gestion DNS libre et open-source. Propager le bonheur, un domaine à la fois."
|
||||||
|
- id: footer-made-eu
|
||||||
|
translation: "Fabriqué avec soin en Europe"
|
||||||
|
- id: footer-product
|
||||||
|
translation: "Produit"
|
||||||
- id: footer-happydomain-features
|
- id: footer-happydomain-features
|
||||||
translation: "Fonctionnalités"
|
translation: "Fonctionnalités"
|
||||||
- id: footer-happydomain-testimonials
|
- id: footer-happydomain-testimonials
|
||||||
|
|
@ -223,13 +233,17 @@
|
||||||
- id: footer-resources-faq
|
- id: footer-resources-faq
|
||||||
translation: "FAQ"
|
translation: "FAQ"
|
||||||
- id: footer-company
|
- id: footer-company
|
||||||
translation: "L'association"
|
translation: "Projet"
|
||||||
- id: footer-company-about
|
- id: footer-company-about
|
||||||
translation: "À propos"
|
translation: "À propos"
|
||||||
|
- id: footer-company-license
|
||||||
|
translation: "Licence (AGPL)"
|
||||||
- id: footer-company-contact
|
- id: footer-company-contact
|
||||||
translation: "Contact"
|
translation: "Contact"
|
||||||
- id: footer-follow
|
- id: footer-follow
|
||||||
translation: "Suivez-nous"
|
translation: "Suivez-nous"
|
||||||
|
- id: footer-legal
|
||||||
|
translation: "Légal"
|
||||||
|
|
||||||
- id: cta-account-title
|
- id: cta-account-title
|
||||||
translation: "Prêt à simplifier votre gestion de domaines ?"
|
translation: "Prêt à simplifier votre gestion de domaines ?"
|
||||||
|
|
|
||||||
|
|
@ -1,51 +1,39 @@
|
||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="{{ .Site.LanguageCode }}">
|
<html lang="{{ .Site.LanguageCode }}">
|
||||||
|
{{ partial "head.html" . }}
|
||||||
|
|
||||||
{{ partial "head.html" . }}
|
<body>
|
||||||
|
<div id="all">
|
||||||
|
{{ partial "nav.html" . }} {{ partial "breadcrumbs.html" . }}
|
||||||
|
|
||||||
<body>
|
<div
|
||||||
|
id="content"
|
||||||
|
class="mt-5 mb-5"
|
||||||
|
style="min-height: calc(80vh - 152px)"
|
||||||
|
>
|
||||||
|
{{ if isset .Params "id" }} {{ partial .Params.id . }} {{ else
|
||||||
|
}}
|
||||||
|
|
||||||
<div id="all">
|
<div class="container">
|
||||||
|
{{ if .Params.toc }}
|
||||||
|
<aside>
|
||||||
|
<header>
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
</header>
|
||||||
|
{{ .TableOfContents }}
|
||||||
|
</aside>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
{{ partial "nav.html" . }}
|
<div>{{ .Content }}</div>
|
||||||
|
</div>
|
||||||
{{ partial "breadcrumbs.html" . }}
|
<!-- /.container -->
|
||||||
|
|
||||||
<div id="content" class="mt-5 mb-5" style="min-height: calc(80vh - 180px)">
|
|
||||||
{{ if isset .Params "id" }}
|
|
||||||
|
|
||||||
{{ partial .Params.id . }}
|
|
||||||
|
|
||||||
{{ else }}
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
|
|
||||||
{{ if .Params.toc }}
|
|
||||||
<aside>
|
|
||||||
<header>
|
|
||||||
<h1>{{ .Title }}</h1>
|
|
||||||
</header>
|
|
||||||
{{ .TableOfContents }}
|
|
||||||
</aside>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div>
|
|
||||||
{{ .Content }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
<!-- /#content -->
|
||||||
</div>
|
</div>
|
||||||
<!-- /.container -->
|
<!-- /#all -->
|
||||||
|
|
||||||
{{ end }}
|
{{ partial "footer.html" . }} {{ partial "scripts.html" . }}
|
||||||
</div>
|
</body>
|
||||||
<!-- /#content -->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- /#all -->
|
|
||||||
|
|
||||||
{{ partial "footer.html" . }}
|
|
||||||
|
|
||||||
{{ partial "scripts.html" . }}
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,14 @@
|
||||||
|
|
||||||
{{ partial "jumbo.html" . }}
|
{{ partial "jumbo.html" . }}
|
||||||
|
|
||||||
{{ partial "carousel.html" . }}
|
{{ partial "work-with.html" . }}
|
||||||
|
|
||||||
|
{{ partial "big-idea.html" . }}
|
||||||
|
|
||||||
{{ partial "features.html" . }}
|
{{ partial "features.html" . }}
|
||||||
|
|
||||||
|
{{ partial "carousel.html" . }}
|
||||||
|
|
||||||
{{ partial "discover.html" . }}
|
{{ partial "discover.html" . }}
|
||||||
|
|
||||||
{{/* partial "testimonials.html" . */}}
|
{{/* partial "testimonials.html" . */}}
|
||||||
|
|
|
||||||
72
layouts/partials/big-idea.html
Normal file
72
layouts/partials/big-idea.html
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
<!-- ── The big idea: services not records ─────────────── -->
|
||||||
|
<section class="section section--paper" id="idea">
|
||||||
|
<div class="container">
|
||||||
|
<div class="section-head">
|
||||||
|
<span class="eyebrow"><span class="dot"></span>The big idea</span>
|
||||||
|
<h2 class="h2">Stop reading zone files.<br>Start managing services.</h2>
|
||||||
|
<p class="lede">DNS records are an implementation detail. happyDomain groups them by what they actually <em>do</em> — your email, your website, your delegation — so you can edit with intent instead of decoding RFCs.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="idea-grid">
|
||||||
|
<div class="idea-col">
|
||||||
|
<div class="idea-tag"><span class="num">A</span>Without happyDomain</div>
|
||||||
|
<h3><span class="strike">happydomain.org</span> · zone file</h3>
|
||||||
|
<pre class="zone-pre"><span class="c">; Zone: happydomain.org.</span>
|
||||||
|
<span class="c">; TTL = 3600</span>
|
||||||
|
|
||||||
|
@ IN <span class="k">SOA</span> ns1 admin 2024010101 3600 900 604800 300
|
||||||
|
@ IN <span class="k">NS</span> ns1.happydomain.org.
|
||||||
|
@ IN <span class="k">NS</span> ns2.happydomain.org.
|
||||||
|
@ IN <span class="k">A</span> <span class="v">93.184.216.34</span>
|
||||||
|
@ IN <span class="k">AAAA</span> <span class="v">2606:2800:220:1:248:1893:25c8:1946</span>
|
||||||
|
@ IN <span class="k">MX</span> 10 mail.happydomain.org.
|
||||||
|
@ IN <span class="k">TXT</span> <span class="v">"v=spf1 include:_spf.eu ~all"</span>
|
||||||
|
_dmarc IN <span class="k">TXT</span> <span class="v">"v=DMARC1; p=none; rua=…"</span>
|
||||||
|
mail IN <span class="k">A</span> <span class="v">93.184.216.40</span>
|
||||||
|
www IN <span class="k">CNAME</span> @
|
||||||
|
@ IN <span class="k">CAA</span> <span class="v">0 issue "letsencrypt.org"</span></pre>
|
||||||
|
</div>
|
||||||
|
<div class="idea-col">
|
||||||
|
<div class="idea-tag"><span class="num">B</span>With happyDomain</div>
|
||||||
|
<h3>happydomain.org · services</h3>
|
||||||
|
<div class="svc">
|
||||||
|
<div class="svc-row">
|
||||||
|
<div class="svc-l">
|
||||||
|
<div class="svc-ico"><i class="bi bi-globe2"></i></div>
|
||||||
|
<div><div class="svc-name">Website</div><div class="svc-desc">A, AAAA on @ · CNAME on www</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="svc-r"><span class="svc-cnt">3</span><span class="svc-ok"><i class="bi bi-check-circle-fill"></i> OK</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="svc">
|
||||||
|
<div class="svc-row">
|
||||||
|
<div class="svc-l">
|
||||||
|
<div class="svc-ico"><i class="bi bi-envelope"></i></div>
|
||||||
|
<div><div class="svc-name">Email</div><div class="svc-desc">MX, SPF and DMARC policy</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="svc-r"><span class="svc-cnt">3</span><span class="svc-ok"><i class="bi bi-check-circle-fill"></i> OK</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="svc">
|
||||||
|
<div class="svc-row">
|
||||||
|
<div class="svc-l">
|
||||||
|
<div class="svc-ico"><i class="bi bi-diagram-3"></i></div>
|
||||||
|
<div><div class="svc-name">Delegation</div><div class="svc-desc">2 nameservers</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="svc-r"><span class="svc-cnt">2</span><span class="svc-ok"><i class="bi bi-check-circle-fill"></i> OK</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="svc">
|
||||||
|
<div class="svc-row">
|
||||||
|
<div class="svc-l">
|
||||||
|
<div class="svc-ico"><i class="bi bi-shield-check"></i></div>
|
||||||
|
<div><div class="svc-name">TLS / Security</div><div class="svc-desc">CAA · Let's Encrypt only</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="svc-r"><span class="svc-cnt">1</span><span class="svc-ok"><i class="bi bi-check-circle-fill"></i> OK</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p style="font-size:12.5px; color: var(--fg-3); margin: 16px 0 0;">Same zone. Edit by intent, not by record type.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<nav aria-label="breadcrumb" style="background-color: #e9ecef">
|
<nav aria-label="breadcrumb" style="background-color: #e9ecef">
|
||||||
<ol class="breadcrumb container">
|
<ol class="breadcrumb container">
|
||||||
<li class="breadcrumb-item"><a href="../">{{ i18n "home" }}</a></li>
|
<li class="breadcrumb-item"><a href="../">{{ i18n "home" }}</a></li>
|
||||||
<li class="breadcrumb-item active" aria-current="page">{{ .Title }}</li>
|
<li class="breadcrumb-item active" aria-current="page">{{ .Title }}</li>
|
||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,24 @@
|
||||||
{{ if isset .Site.Params "carousel" }}
|
{{ if isset .Site.Params "carousel" }} {{ if gt (len .Site.Params.carousel) 0 }}
|
||||||
{{ if gt (len .Site.Params.carousel) 0 }}
|
<section
|
||||||
<section id="screenshots" class="carousel text-light p-4 pt-5 d-flex flex-nowrap align-items-center" style="gap: 1em 1em; overflow-x: scroll">
|
id="screenshots"
|
||||||
{{ range sort .Site.Params.carousel "weight" }}
|
class="carousel text-light p-4 pt-5 d-flex flex-nowrap align-items-center"
|
||||||
<figure class="my-5 mr-5 text-center" style="min-width: 65vw">
|
style="gap: 1em 1em; overflow-x: scroll"
|
||||||
<a href="{{ .image }}">
|
>
|
||||||
<img class="rounded img-thumbnail" src="{{ .image }}" alt="{{ .title }}" loading="lazy" style="max-height: 80vh;">
|
{{ range sort .Site.Params.carousel "weight" }}
|
||||||
</a>
|
<figure class="my-5 me-5 text-center" style="min-width: 65vw">
|
||||||
<figcaption class="mt-2 text-center">{{ .description | markdownify }}</figcaption>
|
<a href="{{ .image }}">
|
||||||
</figure>
|
<img
|
||||||
{{ end }}
|
class="rounded img-thumbnail"
|
||||||
|
src="{{ .image }}"
|
||||||
|
alt="{{ .title }}"
|
||||||
|
loading="lazy"
|
||||||
|
style="max-height: 80vh"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
<figcaption class="mt-2 text-center">
|
||||||
|
{{ .description | markdownify }}
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
{{ end }}
|
||||||
</section>
|
</section>
|
||||||
{{ end }}
|
{{ end }} {{ end }}
|
||||||
{{ end }}
|
|
||||||
|
|
|
||||||
|
|
@ -1,56 +1,40 @@
|
||||||
<div class="container mt-5 mb-4 pb-5" id="community" style="gap: 2em 0;">
|
<div class="container mt-5 mb-4 pb-5" id="community" style="gap: 2em 0">
|
||||||
<div class="d-flex flex-wrap">
|
<div class="d-flex flex-wrap">
|
||||||
<div class="py-4 px-5">
|
<div class="py-4 px-5">
|
||||||
<h3 class="display-4 text-center mb-5">
|
<h3 class="display-4 text-center mb-5">
|
||||||
🙌 <br>{{ i18n "community-contribute" }}
|
🙌 <br />{{ i18n "community-contribute" }}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<h4>
|
<h4>🧰 {{ i18n "community-bugs" }}</h4>
|
||||||
🧰
|
<p class="mb-4 text-justify">
|
||||||
{{ i18n "community-bugs" }}
|
{{ i18n "community-bugs-text" | markdownify }}
|
||||||
</h4>
|
</p>
|
||||||
<p class="mb-4 text-justify">
|
|
||||||
{{ i18n "community-bugs-text" | markdownify }}
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4>
|
<h4>🧳 {{ i18n "community-translation" }}</h4>
|
||||||
🧳
|
<p class="mb-4 text-justify">
|
||||||
{{ i18n "community-translation" }}
|
{{ i18n "community-translation-text" | markdownify }}
|
||||||
</h4>
|
</p>
|
||||||
<p class="mb-4 text-justify">
|
|
||||||
{{ i18n "community-translation-text" | markdownify }}
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4>
|
<h4>💻 {{ i18n "community-code" }}</h4>
|
||||||
💻
|
<p class="mb-4 text-justify">
|
||||||
{{ i18n "community-code" }}
|
{{ i18n "community-code-text" | markdownify }}
|
||||||
</h4>
|
</p>
|
||||||
<p class="mb-4 text-justify">
|
</div>
|
||||||
{{ i18n "community-code-text" | markdownify }}
|
|
||||||
</p>
|
<div class="py-4 px-5">
|
||||||
|
<h3 class="display-4 text-center mb-5">
|
||||||
|
✉️ <br />{{ i18n "community-discuss" }}
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<h4>💬 {{ i18n "community-chat" }}</h4>
|
||||||
|
<p class="mb-4 text-justify">
|
||||||
|
{{ i18n "community-chat-text" | markdownify }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h4>✍🏼 {{ i18n "community-contact" }}</h4>
|
||||||
|
<p class="mb-4 text-justify">
|
||||||
|
{{ i18n "community-contact-text" | markdownify }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="py-4 px-5">
|
|
||||||
<h3 class="display-4 text-center mb-5">
|
|
||||||
✉️ <br>{{ i18n "community-discuss" }}
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<h4>
|
|
||||||
💬
|
|
||||||
{{ i18n "community-chat" }}
|
|
||||||
</h4>
|
|
||||||
<p class="mb-4 text-justify">
|
|
||||||
{{ i18n "community-chat-text" | markdownify }}
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4>
|
|
||||||
✍🏼
|
|
||||||
{{ i18n "community-contact" }}
|
|
||||||
</h4>
|
|
||||||
<p class="mb-4 text-justify">
|
|
||||||
{{ i18n "community-contact-text" | markdownify }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,24 @@
|
||||||
<!-- Call to Action Section -->
|
<!-- Call to Action Section -->
|
||||||
<section id="cta">
|
<section id="cta">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="cta-content">
|
<div class="cta-content">
|
||||||
<h2 class="display-5 font-weight-bold mb-4">{{ i18n "cta-account-title" }}</h2>
|
<h2 class="display-5 fw-bold mb-4">
|
||||||
<div class="row mb-4">
|
{{ i18n "cta-account-title" }}
|
||||||
<p class="offset-sm-1 col-sm-10 offset-md-2 col-md-8 lead text-light">
|
</h2>
|
||||||
{{ i18n "cta-account-text" }}
|
<div class="row mb-4">
|
||||||
</p>
|
<p
|
||||||
</div>
|
class="offset-sm-1 col-sm-10 offset-md-2 col-md-8 lead text-light"
|
||||||
<a href="/register" class="btn btn-lg btn-light px-4" style="border-radius: 2em" data-umami-event="cta-join">{{ i18n "cta-account-button" }}</a>
|
>
|
||||||
|
{{ i18n "cta-account-text" }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
href="/register"
|
||||||
|
class="btn btn-lg btn-light px-4"
|
||||||
|
style="border-radius: 2em"
|
||||||
|
data-umami-event="cta-join"
|
||||||
|
>{{ i18n "cta-account-button" }}</a
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,61 @@
|
||||||
<div class="bg-light">
|
<div class="bg-light">
|
||||||
<div class="container pb-5">
|
<div class="container pb-5">
|
||||||
<div class="card bg-secondary text-light" style="border-radius: 1rem; box-shadow: 3px 3px 5px #999">
|
<div
|
||||||
<div class="card-body p-5">
|
class="card bg-secondary text-light"
|
||||||
<div class="row">
|
style="border-radius: 1rem; box-shadow: 3px 3px 5px #999"
|
||||||
<div class="col-lg-7 d-flex flex-column justify-content-center">
|
>
|
||||||
<h2 class="font-weight-bold">
|
<div class="card-body p-5">
|
||||||
{{ i18n "cta-newsletter-title" }}
|
<div class="row">
|
||||||
</h2>
|
<div
|
||||||
<p class="lead mb-0">
|
class="col-lg-7 d-flex flex-column justify-content-center"
|
||||||
{{ i18n "cta-newsletter-text" }}
|
>
|
||||||
</p>
|
<h2 class="fw-bold">
|
||||||
</div>
|
{{ i18n "cta-newsletter-title" }}
|
||||||
<form
|
</h2>
|
||||||
class="offset-xl-1 col-xl-4 col-lg-5 d-flex flex-column justify-content-center"
|
<p class="lead mb-0">
|
||||||
method="post"
|
{{ i18n "cta-newsletter-text" }}
|
||||||
action="https://lists.happydomain.org/subscription/form"
|
</p>
|
||||||
>
|
</div>
|
||||||
<input type="hidden" name="nonce" />
|
<form
|
||||||
<input type="hidden" name="l" value="b3297dce-4f02-42a5-9918-54499804323e" />
|
class="offset-xl-1 col-xl-4 col-lg-5 d-flex flex-column justify-content-center"
|
||||||
<input type="hidden" name="lang" value="{{ site.LanguageCode }}" />
|
method="post"
|
||||||
<input type="email" name="email" required placeholder="j.postel@isi.edu" class="form-control my-3">
|
action="https://lists.happydomain.org/subscription/form"
|
||||||
<div class="my-2 mx-auto h-captcha" data-sitekey="12a1e811-7f34-44ca-9e7c-fb1e9ade6b00"></div>
|
>
|
||||||
<button type="submit" class="btn btn-lg btn-primary py-2" data-umami-event="cta-newsletter-join">
|
<input type="hidden" name="nonce" />
|
||||||
{{ i18n "cta-newsletter-button1" }}
|
<input
|
||||||
</button>
|
type="hidden"
|
||||||
<small class="form-text text-justify my-2">
|
name="l"
|
||||||
{{ i18n "cta-newsletter-no-spam" }}
|
value="b3297dce-4f02-42a5-9918-54499804323e"
|
||||||
</small>
|
/>
|
||||||
</form>
|
<input
|
||||||
|
type="hidden"
|
||||||
|
name="lang"
|
||||||
|
value="{{ site.LanguageCode }}"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
name="email"
|
||||||
|
required
|
||||||
|
placeholder="j.postel@isi.edu"
|
||||||
|
class="form-control my-3"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="my-2 mx-auto h-captcha"
|
||||||
|
data-sitekey="12a1e811-7f34-44ca-9e7c-fb1e9ade6b00"
|
||||||
|
></div>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="btn btn-lg btn-primary py-2"
|
||||||
|
data-umami-event="cta-newsletter-join"
|
||||||
|
>
|
||||||
|
{{ i18n "cta-newsletter-button1" }}
|
||||||
|
</button>
|
||||||
|
<small class="form-text my-2">
|
||||||
|
{{ i18n "cta-newsletter-no-spam" }}
|
||||||
|
</small>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,68 +1,68 @@
|
||||||
<section id="discover" class="py-5" style="background: linear-gradient(to right, var(--secondary-ultralight) 0%, white 100%)">
|
<section id="discover" class="py-5" style="background: linear-gradient(to right, var(--secondary-ultralight) 0%, white 100%)">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="section-title text-center mb-5">
|
<div class="section-title text-center mb-5">
|
||||||
<h2 class="mb-3 display-4">
|
<h2 class="mb-3 display-4">
|
||||||
{{ i18n "discover-title" }}
|
{{ i18n "discover-title" }}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<p class="offset-sm-1 col-sm-10 offset-md-2 col-md-8 text-muted" style="font-size: 1.15rem;">
|
<p class="offset-sm-1 col-sm-10 offset-md-2 col-md-8 text-muted" style="font-size: 1.15rem;">
|
||||||
{{ i18n "discover-lead" }}
|
{{ i18n "discover-lead" }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="steps">
|
<div class="steps">
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step-number">1</div>
|
<div class="step-number">1</div>
|
||||||
<h3>{{ i18n "discover-1-title" }}</h3>
|
<h3>{{ i18n "discover-1-title" }}</h3>
|
||||||
<p>{{ i18n "discover-1-text" }}</p>
|
<p>{{ i18n "discover-1-text" }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step-number">2</div>
|
<div class="step-number">2</div>
|
||||||
<h3>{{ i18n "discover-2-title" }}</h3>
|
<h3>{{ i18n "discover-2-title" }}</h3>
|
||||||
<p>{{ i18n "discover-2-text" }}</p>
|
<p>{{ i18n "discover-2-text" }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="step">
|
<div class="step">
|
||||||
<div class="step-number">3</div>
|
<div class="step-number">3</div>
|
||||||
<h3>{{ i18n "discover-3-title" }}</h3>
|
<h3>{{ i18n "discover-3-title" }}</h3>
|
||||||
<p>{{ i18n "discover-3-text" }}</p>
|
<p>{{ i18n "discover-3-text" }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 class="text-center my-5">
|
<h3 class="text-center my-5">
|
||||||
{{ i18n "learnhow" }} happy<strong>Domain</strong> {{ i18n "canhelpyou" }}
|
{{ i18n "learnhow" }} happy<strong>Domain</strong> {{ i18n "canhelpyou" }}
|
||||||
</h3>
|
</h3>
|
||||||
<div class="row row-cols-2 row-cols-sm-3 row-cols-md-4 row-cols-lg-5 justify-content-center">
|
<div class="row row-cols-2 row-cols-sm-3 row-cols-md-4 row-cols-lg-5 justify-content-center">
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<a href="{{ ref . "/use-happyDomain/freelance" }}" class="card h-100" data-umami-event="learnmore-freelance">
|
<a href="{{ ref . "/use-happyDomain/freelance" }}" class="card h-100" data-umami-event="learnmore-freelance">
|
||||||
<img src="/img/screenshots/users/freelance.webp" alt="{{ i18n "freelance" }}" class="img-top flex-grow-1">
|
<img src="/img/screenshots/users/freelance.webp" alt="{{ i18n "freelance" }}" class="img-top flex-grow-1">
|
||||||
<h3 class="text-center mt-1">{{ i18n "freelance" }}</h3>
|
<h3 class="text-center mt-1">{{ i18n "freelance" }}</h3>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<a href="{{ ref . "/use-happyDomain/sysadmin" }}" class="card h-100" data-umami-event="learnmore-sysadmin">
|
<a href="{{ ref . "/use-happyDomain/sysadmin" }}" class="card h-100" data-umami-event="learnmore-sysadmin">
|
||||||
<img src="/img/screenshots/users/sysadmin.webp" alt="{{ i18n "sysadmin" }}" class="img-top flex-grow-1">
|
<img src="/img/screenshots/users/sysadmin.webp" alt="{{ i18n "sysadmin" }}" class="img-top flex-grow-1">
|
||||||
<h3 class="text-center mt-1">{{ i18n "sysadmin" }}</h3>
|
<h3 class="text-center mt-1">{{ i18n "sysadmin" }}</h3>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<a href="{{ ref . "/use-happyDomain/devops" }}" class="card h-100" data-umami-event="learnmore-devops">
|
<a href="{{ ref . "/use-happyDomain/devops" }}" class="card h-100" data-umami-event="learnmore-devops">
|
||||||
<img src="/img/screenshots/users/devops.webp" alt="{{ i18n "devops" }}" class="img-top flex-grow-1">
|
<img src="/img/screenshots/users/devops.webp" alt="{{ i18n "devops" }}" class="img-top flex-grow-1">
|
||||||
<h3 class="text-center mt-1">{{ i18n "devops" }}</h3>
|
<h3 class="text-center mt-1">{{ i18n "devops" }}</h3>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<a href="{{ ref . "/use-happyDomain/cio" }}" class="card h-100" data-umami-event="learnmore-cio">
|
<a href="{{ ref . "/use-happyDomain/cio" }}" class="card h-100" data-umami-event="learnmore-cio">
|
||||||
<img src="/img/screenshots/users/cio.webp" alt="{{ i18n "cio" }}" class="img-top flex-grow-1">
|
<img src="/img/screenshots/users/cio.webp" alt="{{ i18n "cio" }}" class="img-top flex-grow-1">
|
||||||
<h3 class="text-center mt-1">{{ i18n "cio" }}</h3>
|
<h3 class="text-center mt-1">{{ i18n "cio" }}</h3>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<a href="{{ ref . "/use-happyDomain/geek" }}" class="card h-100" data-umami-event="learnmore-geek">
|
<a href="{{ ref . "/use-happyDomain/geek" }}" class="card h-100" data-umami-event="learnmore-geek">
|
||||||
<img src="/img/screenshots/users/geek.webp" alt="{{ i18n "geek" }}" class="img-top flex-grow-1">
|
<img src="/img/screenshots/users/geek.webp" alt="{{ i18n "geek" }}" class="img-top flex-grow-1">
|
||||||
<h3 class="text-center mt-1">{{ i18n "geek" }}</h3>
|
<h3 class="text-center mt-1">{{ i18n "geek" }}</h3>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,68 @@
|
||||||
<div id="downloads" class="py-5" style="scroll-margin-top: 2em;">
|
<div id="downloads" class="py-5" style="scroll-margin-top: 2em">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-3 d-none d-md-flex flex-column justify-content-center">
|
<div
|
||||||
<img src="/img/screenshots/users/download.webp" alt="Download section" id="download-house" class="position-relative">
|
class="col-3 d-none d-md-flex flex-column justify-content-center"
|
||||||
</div>
|
>
|
||||||
<div class="col">
|
<img
|
||||||
<h3 class="font-weight-bolder">
|
src="/img/screenshots/users/download.webp"
|
||||||
{{ i18n "downloads-title" }}
|
alt="Download section"
|
||||||
<span class="text-muted">
|
id="download-house"
|
||||||
{{ i18n "downloads-subtitle" }}
|
class="position-relative"
|
||||||
</span>
|
/>
|
||||||
</h3>
|
</div>
|
||||||
<div class="row row-cols-1 row-cols-sm-3 my-4 align-items-center">
|
<div class="col">
|
||||||
|
<h3 class="fw-bolder">
|
||||||
|
{{ i18n "downloads-title" }}
|
||||||
|
<span class="text-muted">
|
||||||
|
{{ i18n "downloads-subtitle" }}
|
||||||
|
</span>
|
||||||
|
</h3>
|
||||||
|
<div
|
||||||
|
class="row row-cols-1 row-cols-sm-3 my-4 align-items-center"
|
||||||
|
>
|
||||||
|
<div class="col text-center my-2">
|
||||||
|
<a
|
||||||
|
href="https://hub.docker.com/r/happydomain/happydomain/"
|
||||||
|
class="h-100 btn btn-lg btn-success"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
data-umami-event="download-docker"
|
||||||
|
>
|
||||||
|
<i class="bi bi-box"></i>
|
||||||
|
{{ i18n "downloads-docker" }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="col text-center my-2">
|
<div class="col text-center my-2">
|
||||||
<a href="https://hub.docker.com/r/happydomain/happydomain/" class="h-100 btn btn-lg btn-success" target="_blank" rel="noopener" data-umami-event="download-docker">
|
<a
|
||||||
<i class="bi bi-box"></i>
|
href="https://get.happydomain.org/master/"
|
||||||
{{ i18n "downloads-docker" }}
|
class="h-100 btn btn-lg btn-success"
|
||||||
</a>
|
target="_blank"
|
||||||
</div>
|
rel="noopener"
|
||||||
|
data-umami-event="download-binaries"
|
||||||
|
>
|
||||||
|
<i class="bi bi-download"></i>
|
||||||
|
{{ i18n "downloads-binaries" }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="col text-center my-2">
|
<div class="col text-center my-2">
|
||||||
<a href="https://get.happydomain.org/master/" class="h-100 btn btn-lg btn-success" target="_blank" rel="noopener" data-umami-event="download-binaries">
|
<a
|
||||||
<i class="bi bi-download"></i>
|
href="https://git.happydomain.org/"
|
||||||
{{ i18n "downloads-binaries" }}
|
class="h-100 btn btn-lg btn-success"
|
||||||
</a>
|
target="_blank"
|
||||||
</div>
|
rel="noopener"
|
||||||
|
data-umami-event="download-sources"
|
||||||
<div class="col text-center my-2">
|
>
|
||||||
<a href="https://git.happydomain.org/" class="h-100 btn btn-lg btn-success" target="_blank" rel="noopener" data-umami-event="download-sources">
|
<i class="bi bi-git"></i>
|
||||||
<i class="bi bi-git"></i>
|
{{ i18n "downloads-source" }}
|
||||||
{{ i18n "downloads-source" }}
|
</a>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{ i18n "downloads-text" | markdownify }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ i18n "downloads-text" | markdownify }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,56 +1,86 @@
|
||||||
<section id="features" class="bg-light" style="scroll-margin-top: 2em;">
|
<section id="features" class="section" style="scroll-margin-top: 2em">
|
||||||
<div class="container py-4">
|
<div class="container">
|
||||||
<div class="section-title text-center mt-5 mb-5">
|
<div class="section-head">
|
||||||
<h2 class="mb-3 display-4">
|
<span class="eyebrow"
|
||||||
{{ i18n "features-title" }}
|
><span class="dot"></span>{{ i18n "features-eyebrow" }}</span
|
||||||
</h2>
|
>
|
||||||
<div class="row">
|
<h2 class="h2">{{ i18n "features-title" }}</h2>
|
||||||
<p class="offset-sm-1 col-sm-10 offset-md-2 col-md-8 text-muted" style="font-size: 1.15rem;">
|
<p class="lede">{{ i18n "features-lead" }}</p>
|
||||||
{{ i18n "features-lead" }}
|
</div>
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="alert alert-warning my-5 d-flex">
|
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3">
|
||||||
<div class="display-2">🏗️</div>
|
{{ range $index, $element := $.Site.Data.features.features }} {{ if
|
||||||
<div class="ml-2 flex-fill">
|
index .title $.Language.Lang }}
|
||||||
<p class="lead">
|
<div class="col mb-5">
|
||||||
{{ i18n "features-wip-lead" }}
|
<div class="h-100 card" id="feature-{{ .id }}">
|
||||||
</p>
|
{{ if and .img .img.src }}
|
||||||
<p>
|
<img
|
||||||
{{ i18n "features-wip-p1-start" }}
|
src="{{ .img.src }}"
|
||||||
<strong>{{ i18n "features-wip-p1-strong" }} <a href="https://github.com/happyDomain/happydomain/" target="_blank" rel="noopener" data-umami-event="goto-issue">{{ i18n "features-wip-p1-link" }}</a>.</strong> {{ i18n "features-wip-p1-end" }}
|
class="card-img-top"
|
||||||
</p>
|
alt="{{ index .img.alt $.Language.Lang }}"
|
||||||
<p>
|
/>
|
||||||
<a href="https://feedback.happydomain.org" target="_blank" rel="noopener" data-umami-event="goto-feedback">{{ i18n "features-wip-p2-feedback" }}</a> {{ i18n "features-wip-p2-start" }} <u>{{ i18n "features-wip-p2-emph" }}</u>{{ i18n "features-wip-p2-end" }}
|
{{ end }}
|
||||||
</p>
|
<div class="card-body align-items-center">
|
||||||
</div>
|
<div class="d-flex flex-column justify-content-center">
|
||||||
</div>
|
<h4 class="card-title fw-bolder">
|
||||||
|
{{ index .title $.Language.Lang }}
|
||||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3">
|
</h4>
|
||||||
{{ range $index, $element := $.Site.Data.features.features }}
|
<p class="card-text">
|
||||||
{{ if index .title $.Language.Lang }}
|
{{ index .content $.Language.Lang }}
|
||||||
<div class="col mb-5">
|
</p>
|
||||||
<div class="h-100 card" id="feature-{{ .id }}">
|
{{ if and .link .link.link }}
|
||||||
{{ if and .img .img.src }}
|
<a
|
||||||
<img src="{{ .img.src }}" class="card-img-top" alt="{{ index .img.alt $.Language.Lang }}">
|
href="{{ .link.link }}"
|
||||||
{{ end }}
|
class="card-link"
|
||||||
<div class="card-body align-items-center">
|
data-umami-event="features-{{ .id }}"
|
||||||
<div class="d-flex flex-column justify-content-center">
|
>{{ index .link $.Language.Lang }}</a
|
||||||
<h4 class="card-title font-weight-bolder">{{ index .title $.Language.Lang }}</h4>
|
>
|
||||||
<p class="card-text text-justify">{{ index .content $.Language.Lang }}</p>
|
{{ end }} {{ if and .link2 .link2.link }}
|
||||||
{{ if and .link .link.link }}
|
<br /><a
|
||||||
<a href="{{ .link.link }}" class="card-link" data-umami-event="features-{{ .id }}">{{ index .link $.Language.Lang }}</a>
|
href="{{ .link2.link }}"
|
||||||
{{ end }}
|
class="card-link mt-2"
|
||||||
{{ if and .link2 .link2.link }}
|
data-umami-event="features-{{ .id }}-2"
|
||||||
<br><a href="{{ .link2.link }}" class="card-link mt-2" data-umami-event="features-{{ .id }}-2">{{ index .link2 $.Language.Lang }}</a>
|
>{{ index .link2 $.Language.Lang }}</a
|
||||||
{{ end }}
|
>
|
||||||
</div>
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{{ end }} {{ end }}
|
||||||
{{ end }}
|
</div>
|
||||||
{{ end }}
|
|
||||||
|
<div class="alert alert-warning mt-5 d-flex">
|
||||||
|
<div class="display-2">🏗️</div>
|
||||||
|
<div class="ms-2 flex-fill">
|
||||||
|
<p class="lead">{{ i18n "features-wip-lead" }}</p>
|
||||||
|
<p>
|
||||||
|
{{ i18n "features-wip-p1-start" }}
|
||||||
|
<strong
|
||||||
|
>{{ i18n "features-wip-p1-strong" }}
|
||||||
|
<a
|
||||||
|
href="https://github.com/happyDomain/happydomain/"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
data-umami-event="goto-issue"
|
||||||
|
>{{ i18n "features-wip-p1-link" }}</a
|
||||||
|
>.</strong
|
||||||
|
>
|
||||||
|
{{ i18n "features-wip-p1-end" }}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a
|
||||||
|
href="https://feedback.happydomain.org"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
data-umami-event="goto-feedback"
|
||||||
|
>{{ i18n "features-wip-p2-feedback" }}</a
|
||||||
|
>
|
||||||
|
{{ i18n "features-wip-p2-start" }}
|
||||||
|
<u>{{ i18n "features-wip-p2-emph" }}</u>{{ i18n
|
||||||
|
"features-wip-p2-end" }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -1,81 +1,70 @@
|
||||||
<footer class="pt-3 pb-2 bg-dark text-light">
|
<footer class="pt-5 pb-3 bg-dark text-light">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-4">
|
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-5 g-4 mb-4">
|
||||||
<div class="col">
|
<div class="col footer-brand-col">
|
||||||
<h3>
|
<div class="footer-logo mb-3">
|
||||||
<svg version="1.1" viewBox="7 5 100 15" aria-labelledby="title" height="1.1em">
|
{{ partial "logo.html" (dict "height" "1.4em") }}
|
||||||
<title>happyDomain</title>
|
</div>
|
||||||
<g fill="#fff" stroke="#fff" stroke-width=".4" aria-label="happy"><path d="m7.1613 5.7392h0.28939v4.2106q2.59-0.96945 3.9791-0.96945 0.77412 0 1.172 0.30386 0.709 0.53537 0.709 2.0257v4.8907h-0.28939v-4.8907q0-1.3457-0.59325-1.7942-0.36174-0.27492-1.0563-0.27492-0.57878 0-1.3746 0.1881-0.88264 0.20981-2.5466 0.83199v5.9397h-0.28939z" /><path d="m21.175 12.721h-2.7781q-1.1214 0-1.6929 0.24598-0.82476 0.36174-0.82476 1.3095 0 0.79582 0.5209 1.2299 0.49196 0.41238 1.3022 0.41238h0.0217q0.83923 0 1.8231-0.60772 0.34003-0.20981 0.83923-0.57878 0.709-0.52813 0.78858-0.57878zm2.496 3.0748q-0.3762 0.44132-1.0852 0.44132-0.67283 0-1.0418-0.39068-0.36897-0.39067-0.36897-1.0635v-0.28215q-1.3674 0.99116-1.6206 1.1431-0.96222 0.56431-1.8304 0.56431h-0.0217q-0.93328 0-1.5048-0.49196-0.60772-0.52813-0.60772-1.4397 0-1.0852 0.90434-1.5265 0.65836-0.31833 1.9027-0.31833h2.7781v-1.0635q0-1.0056-0.29662-1.3529-0.67283-0.78858-2.3875-0.78858-0.78135 0-1.3963 0.29662-0.74518 0.34727-0.94051 1.0129l-0.27492-0.07958q0.22428-0.76688 1.0346-1.172 0.69453-0.34727 1.5772-0.34727 1.8449 0 2.6117 0.88987 0.3545 0.42685 0.3545 1.541v3.4148q0.0072 1.1648 1.1286 1.1648 0.57878 0 0.86817-0.34003z" /><path d="m25.27 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z" /><path d="m34.241 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z" /><path d="m49 16.627q-0.1881 1.3891-1.0707 2.1559-0.91157 0.78858-2.4092 0.78858-1.1141-0.0072-2.033-0.42685-1.0635-0.49196-1.4759-1.3963l0.26045-0.12299q0.37621 0.83199 1.3746 1.2733 0.8537 0.38344 1.8738 0.38344 1.3818 0 2.2066-0.709 0.80305-0.6873 0.97669-1.9534 0.05064-0.32556 0.05064-0.88264v-0.49196q-1.7074 0.62942-2.6551 0.83923-0.709 0.15193-1.2588 0.15193-0.80305 0-1.2444-0.3328-0.70177-0.52813-0.70177-2.0257v-4.8762h0.28215v4.8762q0 1.3529 0.59325 1.7942 0.36174 0.27492 1.0563 0.27492 0.57878 0 1.3818-0.1881 0.88264-0.20257 2.5466-0.82476v-5.9325h0.28215v6.6921q0 0.60048-0.03617 0.93328z" /></g>
|
<p class="footer-tagline">{{ i18n "footer-tagline" }}</p>
|
||||||
<g fill="#fff" aria-label="Domain"><path d="m 53.228042,15.362291 h 1.938901 q 1.960602,0 2.966225,-0.940511 0.983919,-0.911573 0.983919,-2.684074 0,-1.786971 -0.991153,-2.749186 -1.020093,-0.991154 -2.987931,-0.991154 h -1.909961 z m 1.909961,-8.949325 q 2.626196,0 4.10931,1.439706 1.47588,1.425236 1.47588,3.885034 0,2.452563 -1.49035,3.841626 -1.475878,1.367358 -4.09484,1.367358 h -3.516064 v -10.533724 z" /><path d="m 62.228011,13.125048 q 0,-1.779737 1.070734,-2.814299 1.085204,-1.056266 2.973461,-1.056266 1.888258,0.0072 2.966228,1.056266 1.077971,1.041797 1.077971,2.814299 0,1.772501 -1.077971,2.807063 -1.07797,1.049032 -2.966228,1.049032 -1.88102,0 -2.973461,-1.041797 -1.070734,-1.049031 -1.070734,-2.814298 z m 1.598866,0 q 0,1.099674 0.593246,1.671215 0.622184,0.60048 1.852083,0.60048 1.2299,0 1.84485,-0.60048 0.593246,-0.571541 0.593246,-1.671215 0,-1.10691 -0.593246,-1.685686 -0.61495,-0.593245 -1.852083,-0.60048 -1.222666,0 -1.84485,0.60048 -0.593246,0.578776 -0.593246,1.685686 z" /><path d="m 73.66607,16.957892 h -1.606103 v -7.668782 h 1.606103 v 0.83199 q 0.687297,-0.535368 1.606105,-0.72347 0.708999,-0.144694 1.273307,-0.144694 0.947746,0 1.519285,0.426847 0.470258,0.340031 0.61495,0.600481 0.904338,-0.658358 1.786972,-0.853695 0.788583,-0.173633 1.396297,-0.173633 0.954981,0 1.526521,0.419613 0.918808,0.665592 0.918808,2.315104 v 4.970239 h -1.606103 v -4.970239 q 0,-0.84646 -0.267684,-1.041797 -0.144695,-0.10852 -0.557072,-0.10852 -0.470255,0 -1.172023,0.166398 -0.998386,0.340031 -1.729091,0.933276 v 5.020882 h -1.613339 v -4.970239 q 0,-0.84646 -0.260448,-1.041797 -0.151929,-0.115755 -0.557073,-0.115755 -0.448553,0 -1.09244,0.151929 -0.759643,0.173632 -1.786972,0.824756 z" /><path d="m 91.051057,14.051772 -1.996779,-0.166398 q -0.954979,0 -1.381828,0.166398 -0.376203,0.151929 -0.376203,0.535368 0,0.368969 0.24598,0.549837 0.289388,0.23151 0.839224,0.23151 h 0.0217 q 0.62942,0 1.425236,-0.405143 0.376206,-0.224275 1.222666,-0.651123 z m 3.935677,2.286165 q -0.752409,0.593246 -1.917197,0.636654 -0.911572,0 -1.46141,-0.528133 -0.245978,-0.238745 -0.383437,-0.542603 -0.477491,0.325562 -0.745175,0.470256 -1.070737,0.578776 -2.07636,0.578776 h -0.0217 q -1.121378,0 -1.852083,-0.578776 -0.839224,-0.665593 -0.839224,-1.786971 0,-1.389063 1.266071,-1.953369 0.759645,-0.332797 2.098063,-0.332797 l 1.996779,0.311092 v -0.643888 q 0,-1.157552 -1.700157,-1.157552 -1.418,0 -2.604492,0.911572 l -0.860928,-1.215429 q 0.549836,-0.499195 1.46141,-0.918807 0.80305,-0.36897 1.794206,-0.36897 2.061887,0 2.995165,0.998389 0.520899,0.571541 0.520899,1.808675 v 3.002401 q 0.0072,0.361734 0.419613,0.434082 h 0.07958 q 0.535365,0 1.157552,-0.405144 z" /><path d="m 96.448142,6.566922 q 0.368969,0 0.636653,0.24598 0.289388,0.267684 0.289388,0.658358 0,0.390674 -0.289388,0.658358 -0.267684,0.245979 -0.636653,0.245979 -0.347266,0 -0.629418,-0.238745 -0.303858,-0.274918 -0.303858,-0.665592 0,-0.390674 0.303858,-0.672827 0.282152,-0.231511 0.629418,-0.231511 z m -0.80305,10.38903 v -7.668782 h 1.598869 v 7.668782 z" /><path d="m 100.803432,16.957892 h -1.598869 v -7.668782 h 1.598869 v 0.774113 q 0.803053,-0.477491 1.758032,-0.665593 0.752409,-0.144694 1.345655,-0.144694 0.969449,0 1.562695,0.405143 0.969446,0.672828 0.969446,2.329574 v 4.970239 h -1.6061 v -4.970239 q 0,-0.831991 -0.289388,-1.034562 -0.173632,-0.12299 -0.636653,-0.12299 -0.477491,0 -1.179256,0.151929 -0.810287,0.180867 -1.924431,0.759643 z" /></g>
|
<div class="footer-social d-flex flex-wrap gap-2 mt-3">
|
||||||
</svg>
|
<a href="https://framagit.org/happyDomain/happydomain" target="_blank" rel="noopener" title="Framagit" data-umami-event="footer-framagit">
|
||||||
</h3>
|
|
||||||
<ul class="footer-links">
|
|
||||||
<li><a href="#features">{{ i18n "footer-happydomain-features" }}</a></li>
|
|
||||||
<li><a href="#discover">{{ i18n "discover-title" }}</a></li>
|
|
||||||
<li><a href="https://try.happydomain.org/" data-umami-event="footer-tryit">{{ i18n "tryit" }}</a></li>
|
|
||||||
<!--li><a href="#testimonials">{{ i18n "footer-happydomain-testimonials" }}</a></li-->
|
|
||||||
<li><a href="#downloads">{{ i18n "footer-happydomain-downloads" }}</a></li>
|
|
||||||
<!--li><a href="#">{{ i18n "footer-happydomain-prices" }}</a></li-->
|
|
||||||
<li><a href="https://github.com/happyDomain/happydomain/" data-umami-event="footer-github">{{ i18n "footer-happydomain-github" }}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<h3>{{ i18n "footer-resources" }}</h3>
|
|
||||||
<ul class="footer-links">
|
|
||||||
<li><a href="https://help.happydomain.org/{{ .Site.Language.Lang }}/" target="_blank" rel="noopener" data-umami-event="footer-docs">{{ i18n "footer-resources-docs" }}</a></li>
|
|
||||||
<li><a href="https://app.happydomain.org/swagger/index.html" target="_blank" rel="noopener" data-umami-event="footer-api">{{ i18n "footer-resources-api" }}</a></li>
|
|
||||||
<li><a href="https://blog.happydomain.org/" data-umami-event="footer-blog">{{ i18n "footer-resources-blog" }}</a></li>
|
|
||||||
<li><a href="/{{ .Site.Language.Lang }}/newsletter/" data-umami-event="footer-newsletter">{{ i18n "footer-resources-newsletter" }}</a></li>
|
|
||||||
<li><a href="/{{ .Site.Language.Lang }}/community/" data-umami-event="footer-community">{{ i18n "footer-resources-community" }}</a></li>
|
|
||||||
<!--li><a href="#">{{ i18n "footer-resources-faq" }}</a></li-->
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<h3>{{ i18n "footer-company" }}</h3>
|
|
||||||
<ul class="footer-links">
|
|
||||||
<li><a href="{{ i18n "footer-us-button-link" }}" data-umami-event="footer-about">{{ i18n "footer-company-about" }}</a></li>
|
|
||||||
<li><a href="/{{ .Site.Language.Lang }}/community/" data-umami-event="footer-contact">{{ i18n "footer-company-contact" }}</a></li>
|
|
||||||
<li><a href="/{{ .Site.Language.Lang }}/legal-notice/">
|
|
||||||
{{ i18n "legal-notice" }}
|
|
||||||
</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<h3>{{ i18n "footer-follow" }}</h3>
|
|
||||||
<div class="d-flex flex-wrap justify-content-between footer-links" style="gap: .5em; font-size: 2em">
|
|
||||||
<a href="https://framagit.org/happyDomain/happydomain" target="_blank" rel="noopener" data-umami-event="footer-framagit">
|
|
||||||
<i class="bi bi-gitlab"></i>
|
<i class="bi bi-gitlab"></i>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/happyDomain/happydomain" target="_blank" rel="noopener" data-umami-event="footer-github-social">
|
<a href="https://github.com/happyDomain/happydomain" target="_blank" rel="noopener" title="GitHub" data-umami-event="footer-github-social">
|
||||||
<i class="bi bi-github"></i>
|
<i class="bi bi-github"></i>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://feedback.happydomain.org/" target="_blank" rel="noopener" data-umami-event="footer-feedback">
|
<a href="https://floss.social/@happyDomain" target="_blank" rel="noopener" title="Mastodon" data-umami-event="footer-mastodon">
|
||||||
<i class="bi bi-lightbulb-fill"></i>
|
|
||||||
</a>
|
|
||||||
<a href="https://floss.social/@happyDomain" target="_blank" rel="noopener" data-umami-event="footer-mastodon">
|
|
||||||
<i class="bi bi-mastodon"></i>
|
<i class="bi bi-mastodon"></i>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://feedback.happydomain.org/" target="_blank" rel="noopener" title="Feedback" data-umami-event="footer-feedback">
|
||||||
|
<i class="bi bi-lightbulb-fill"></i>
|
||||||
|
</a>
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
data-contact="Y29udGFjdEBoYXBweWRvbWFpbi5vcmc="
|
data-contact="Y29udGFjdEBoYXBweWRvbWFpbi5vcmc="
|
||||||
onfocus="this.href = 'mailto:' + atob(this.dataset.contact)"
|
onfocus="this.href = 'mailto:' + atob(this.dataset.contact)"
|
||||||
|
title="Email"
|
||||||
data-umami-event="footer-email"
|
data-umami-event="footer-email"
|
||||||
>
|
>
|
||||||
<i class="bi bi-envelope-at"></i>
|
<i class="bi bi-envelope-at"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h4 class="footer-heading">{{ i18n "footer-product" }}</h4>
|
||||||
|
<ul class="footer-links">
|
||||||
|
<li><a href="#features">{{ i18n "footer-happydomain-features" }}</a></li>
|
||||||
|
<li><a href="#discover">{{ i18n "discover-title" }}</a></li>
|
||||||
|
<li><a href="https://try.happydomain.org/" data-umami-event="footer-tryit">{{ i18n "tryit" }}</a></li>
|
||||||
|
<!--li><a href="#">{{ i18n "footer-happydomain-testimonials" }}</a></li-->
|
||||||
|
<li><a href="#downloads">{{ i18n "footer-happydomain-downloads" }}</a></li>
|
||||||
|
<!--li><a href="#">{{ i18n "footer-happydomain-prices" }}</a></li-->
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h4 class="footer-heading">{{ i18n "footer-resources" }}</h4>
|
||||||
|
<ul class="footer-links">
|
||||||
|
<li><a href="https://help.happydomain.org/{{ .Site.Language.Lang }}/" target="_blank" rel="noopener" data-umami-event="footer-docs">{{ i18n "footer-resources-docs" }}</a></li>
|
||||||
|
<li><a href="https://app.happydomain.org/swagger/index.html" target="_blank" rel="noopener" data-umami-event="footer-api">{{ i18n "footer-resources-api" }}</a></li>
|
||||||
|
<li><a href="https://blog.happydomain.org/" data-umami-event="footer-blog">{{ i18n "footer-resources-blog" }}</a></li>
|
||||||
|
<li><a href="/{{ .Site.Language.Lang }}/newsletter/" data-umami-event="footer-newsletter">{{ i18n "footer-resources-newsletter" }}</a></li>
|
||||||
|
<!--li><a href="#">{{ i18n "footer-resources-faq" }}</a></li-->
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h4 class="footer-heading">{{ i18n "footer-company" }}</h4>
|
||||||
|
<ul class="footer-links">
|
||||||
|
<li><a href="{{ i18n "footer-us-button-link" }}" data-umami-event="footer-about">{{ i18n "footer-company-about" }}</a></li>
|
||||||
|
<li><a href="/{{ .Site.Language.Lang }}/community/" data-umami-event="footer-community">{{ i18n "footer-resources-community" }}</a></li>
|
||||||
|
<li><a href="https://git.happydomain.org/happydomain" target="_blank" rel="noopener" data-umami-event="footer-license">{{ i18n "footer-company-license" }}</a></li>
|
||||||
|
<li><a href="/{{ .Site.Language.Lang }}/community/" data-umami-event="footer-contact">{{ i18n "footer-company-contact" }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<h4 class="footer-heading">{{ i18n "footer-legal" }}</h4>
|
||||||
|
<ul class="footer-links">
|
||||||
|
<li><a href="/{{ .Site.Language.Lang }}/legal-notice/">{{ i18n "legal-notice" }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<p class="pt-2 pb-0 text-center">
|
|
||||||
©
|
|
||||||
2019-{{ now.Year }}
|
|
||||||
<svg version="1.1" viewBox="7 5 100 15" aria-labelledby="title" height="1.1em">
|
|
||||||
<title>happyDomain</title>
|
|
||||||
<g fill="#fff" stroke="#fff" stroke-width=".4" aria-label="happy"><path d="m7.1613 5.7392h0.28939v4.2106q2.59-0.96945 3.9791-0.96945 0.77412 0 1.172 0.30386 0.709 0.53537 0.709 2.0257v4.8907h-0.28939v-4.8907q0-1.3457-0.59325-1.7942-0.36174-0.27492-1.0563-0.27492-0.57878 0-1.3746 0.1881-0.88264 0.20981-2.5466 0.83199v5.9397h-0.28939z" /><path d="m21.175 12.721h-2.7781q-1.1214 0-1.6929 0.24598-0.82476 0.36174-0.82476 1.3095 0 0.79582 0.5209 1.2299 0.49196 0.41238 1.3022 0.41238h0.0217q0.83923 0 1.8231-0.60772 0.34003-0.20981 0.83923-0.57878 0.709-0.52813 0.78858-0.57878zm2.496 3.0748q-0.3762 0.44132-1.0852 0.44132-0.67283 0-1.0418-0.39068-0.36897-0.39067-0.36897-1.0635v-0.28215q-1.3674 0.99116-1.6206 1.1431-0.96222 0.56431-1.8304 0.56431h-0.0217q-0.93328 0-1.5048-0.49196-0.60772-0.52813-0.60772-1.4397 0-1.0852 0.90434-1.5265 0.65836-0.31833 1.9027-0.31833h2.7781v-1.0635q0-1.0056-0.29662-1.3529-0.67283-0.78858-2.3875-0.78858-0.78135 0-1.3963 0.29662-0.74518 0.34727-0.94051 1.0129l-0.27492-0.07958q0.22428-0.76688 1.0346-1.172 0.69453-0.34727 1.5772-0.34727 1.8449 0 2.6117 0.88987 0.3545 0.42685 0.3545 1.541v3.4148q0.0072 1.1648 1.1286 1.1648 0.57878 0 0.86817-0.34003z" /><path d="m25.27 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z" /><path d="m34.241 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z" /><path d="m49 16.627q-0.1881 1.3891-1.0707 2.1559-0.91157 0.78858-2.4092 0.78858-1.1141-0.0072-2.033-0.42685-1.0635-0.49196-1.4759-1.3963l0.26045-0.12299q0.37621 0.83199 1.3746 1.2733 0.8537 0.38344 1.8738 0.38344 1.3818 0 2.2066-0.709 0.80305-0.6873 0.97669-1.9534 0.05064-0.32556 0.05064-0.88264v-0.49196q-1.7074 0.62942-2.6551 0.83923-0.709 0.15193-1.2588 0.15193-0.80305 0-1.2444-0.3328-0.70177-0.52813-0.70177-2.0257v-4.8762h0.28215v4.8762q0 1.3529 0.59325 1.7942 0.36174 0.27492 1.0563 0.27492 0.57878 0 1.3818-0.1881 0.88264-0.20257 2.5466-0.82476v-5.9325h0.28215v6.6921q0 0.60048-0.03617 0.93328z" /></g>
|
|
||||||
<g fill="#fff" aria-label="Domain"><path d="m 53.228042,15.362291 h 1.938901 q 1.960602,0 2.966225,-0.940511 0.983919,-0.911573 0.983919,-2.684074 0,-1.786971 -0.991153,-2.749186 -1.020093,-0.991154 -2.987931,-0.991154 h -1.909961 z m 1.909961,-8.949325 q 2.626196,0 4.10931,1.439706 1.47588,1.425236 1.47588,3.885034 0,2.452563 -1.49035,3.841626 -1.475878,1.367358 -4.09484,1.367358 h -3.516064 v -10.533724 z" /><path d="m 62.228011,13.125048 q 0,-1.779737 1.070734,-2.814299 1.085204,-1.056266 2.973461,-1.056266 1.888258,0.0072 2.966228,1.056266 1.077971,1.041797 1.077971,2.814299 0,1.772501 -1.077971,2.807063 -1.07797,1.049032 -2.966228,1.049032 -1.88102,0 -2.973461,-1.041797 -1.070734,-1.049031 -1.070734,-2.814298 z m 1.598866,0 q 0,1.099674 0.593246,1.671215 0.622184,0.60048 1.852083,0.60048 1.2299,0 1.84485,-0.60048 0.593246,-0.571541 0.593246,-1.671215 0,-1.10691 -0.593246,-1.685686 -0.61495,-0.593245 -1.852083,-0.60048 -1.222666,0 -1.84485,0.60048 -0.593246,0.578776 -0.593246,1.685686 z" /><path d="m 73.66607,16.957892 h -1.606103 v -7.668782 h 1.606103 v 0.83199 q 0.687297,-0.535368 1.606105,-0.72347 0.708999,-0.144694 1.273307,-0.144694 0.947746,0 1.519285,0.426847 0.470258,0.340031 0.61495,0.600481 0.904338,-0.658358 1.786972,-0.853695 0.788583,-0.173633 1.396297,-0.173633 0.954981,0 1.526521,0.419613 0.918808,0.665592 0.918808,2.315104 v 4.970239 h -1.606103 v -4.970239 q 0,-0.84646 -0.267684,-1.041797 -0.144695,-0.10852 -0.557072,-0.10852 -0.470255,0 -1.172023,0.166398 -0.998386,0.340031 -1.729091,0.933276 v 5.020882 h -1.613339 v -4.970239 q 0,-0.84646 -0.260448,-1.041797 -0.151929,-0.115755 -0.557073,-0.115755 -0.448553,0 -1.09244,0.151929 -0.759643,0.173632 -1.786972,0.824756 z" /><path d="m 91.051057,14.051772 -1.996779,-0.166398 q -0.954979,0 -1.381828,0.166398 -0.376203,0.151929 -0.376203,0.535368 0,0.368969 0.24598,0.549837 0.289388,0.23151 0.839224,0.23151 h 0.0217 q 0.62942,0 1.425236,-0.405143 0.376206,-0.224275 1.222666,-0.651123 z m 3.935677,2.286165 q -0.752409,0.593246 -1.917197,0.636654 -0.911572,0 -1.46141,-0.528133 -0.245978,-0.238745 -0.383437,-0.542603 -0.477491,0.325562 -0.745175,0.470256 -1.070737,0.578776 -2.07636,0.578776 h -0.0217 q -1.121378,0 -1.852083,-0.578776 -0.839224,-0.665593 -0.839224,-1.786971 0,-1.389063 1.266071,-1.953369 0.759645,-0.332797 2.098063,-0.332797 l 1.996779,0.311092 v -0.643888 q 0,-1.157552 -1.700157,-1.157552 -1.418,0 -2.604492,0.911572 l -0.860928,-1.215429 q 0.549836,-0.499195 1.46141,-0.918807 0.80305,-0.36897 1.794206,-0.36897 2.061887,0 2.995165,0.998389 0.520899,0.571541 0.520899,1.808675 v 3.002401 q 0.0072,0.361734 0.419613,0.434082 h 0.07958 q 0.535365,0 1.157552,-0.405144 z" /><path d="m 96.448142,6.566922 q 0.368969,0 0.636653,0.24598 0.289388,0.267684 0.289388,0.658358 0,0.390674 -0.289388,0.658358 -0.267684,0.245979 -0.636653,0.245979 -0.347266,0 -0.629418,-0.238745 -0.303858,-0.274918 -0.303858,-0.665592 0,-0.390674 0.303858,-0.672827 0.282152,-0.231511 0.629418,-0.231511 z m -0.80305,10.38903 v -7.668782 h 1.598869 v 7.668782 z" /><path d="m 100.803432,16.957892 h -1.598869 v -7.668782 h 1.598869 v 0.774113 q 0.803053,-0.477491 1.758032,-0.665593 0.752409,-0.144694 1.345655,-0.144694 0.969449,0 1.562695,0.405143 0.969446,0.672828 0.969446,2.329574 v 4.970239 h -1.6061 v -4.970239 q 0,-0.831991 -0.289388,-1.034562 -0.173632,-0.12299 -0.636653,-0.12299 -0.477491,0 -1.179256,0.151929 -0.810287,0.180867 -1.924431,0.759643 z" /></g>
|
|
||||||
</svg>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -1,140 +1,147 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<script>document.documentElement.setAttribute('data-bs-theme',window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light')</script>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="robots" content="all,follow">
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
<meta name="googlebot" content="index,follow,snippet,archive">
|
<meta name="robots" content="all,follow">
|
||||||
<title>{{ .Title }}</title>
|
<meta name="googlebot" content="index,follow,snippet,archive">
|
||||||
<meta name="author" content="{{ .Site.Params.author.name }}" />
|
<title>{{ .Title }}</title>
|
||||||
|
<meta name="author" content="{{ .Site.Params.author.name }}" />
|
||||||
|
|
||||||
{{ if .Keywords }}
|
{{ if .Keywords }}
|
||||||
<meta name="keywords" content="{{ delimit .Keywords ", " }}">
|
<meta name="keywords" content="{{ delimit .Keywords ", " }}">
|
||||||
{{ else if .Site.Params.DefaultKeywords }}
|
{{ else if .Site.Params.DefaultKeywords }}
|
||||||
<meta name="keywords" content="{{ delimit .Site.Params.DefaultKeywords ", " }}">
|
<meta name="keywords" content="{{ delimit .Site.Params.DefaultKeywords ", " }}">
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{ if .Description }}
|
{{ if .Description }}
|
||||||
<meta name="description" content="{{ .Description }}">
|
<meta name="description" content="{{ .Description }}">
|
||||||
{{ else if .Site.Params.DefaultDescription }}
|
{{ else if .Site.Params.DefaultDescription }}
|
||||||
<meta name="description" content="{{ .Site.Params.DefaultDescription }}">
|
<meta name="description" content="{{ .Site.Params.DefaultDescription }}">
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{- $title := .Title | default "happyDomain" }}
|
{{- $title := .Title | default "happyDomain" }}
|
||||||
{{- $description := .Description | default .Site.Params.DefaultDescription }}
|
{{- $description := .Description | default .Site.Params.DefaultDescription }}
|
||||||
{{- $image := .Params.og_image | default (printf "%simg/og.webp" .Site.BaseURL) }}
|
{{- $image := .Params.og_image | default (printf "%simg/og.webp" .Site.BaseURL) }}
|
||||||
{{- $pageURL := .Permalink | default .Site.BaseURL }}
|
{{- $pageURL := .Permalink | default .Site.BaseURL }}
|
||||||
|
|
||||||
<!-- Canonical URL -->
|
<!-- Canonical URL -->
|
||||||
<link rel="canonical" href="{{ $pageURL }}">
|
<link rel="canonical" href="{{ $pageURL }}">
|
||||||
|
|
||||||
<!-- Facebook Meta Tags -->
|
<!-- Facebook Meta Tags -->
|
||||||
<meta property="og:url" content="{{ $pageURL }}">
|
<meta property="og:url" content="{{ $pageURL }}">
|
||||||
<meta property="og:type" content="{{ if .IsHome }}website{{ else }}article{{ end }}">
|
<meta property="og:type" content="{{ if .IsHome }}website{{ else }}article{{ end }}">
|
||||||
<meta property="og:title" content="{{ $title }}">
|
<meta property="og:title" content="{{ $title }}">
|
||||||
<meta property="og:description" content="{{ $description }}">
|
<meta property="og:description" content="{{ $description }}">
|
||||||
<meta property="og:image" content="{{ $image }}">
|
<meta property="og:image" content="{{ $image }}">
|
||||||
<meta property="og:locale" content="{{ .Lang }}">
|
<meta property="og:locale" content="{{ .Lang }}">
|
||||||
{{ range .Translations }}
|
{{ range .Translations }}
|
||||||
<meta property="og:locale:alternate" content="{{ .Lang }}">
|
<meta property="og:locale:alternate" content="{{ .Lang }}">
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<!-- Twitter Meta Tags -->
|
<!-- Twitter Meta Tags -->
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<meta property="twitter:domain" content="happydomain.org">
|
<meta property="twitter:domain" content="happydomain.org">
|
||||||
<meta property="twitter:url" content="{{ $pageURL }}">
|
<meta property="twitter:url" content="{{ $pageURL }}">
|
||||||
<meta name="twitter:title" content="{{ $title }}">
|
<meta name="twitter:title" content="{{ $title }}">
|
||||||
<meta name="twitter:description" content="{{ $description }}">
|
<meta name="twitter:description" content="{{ $description }}">
|
||||||
<meta name="twitter:image" content="{{ $image }}">
|
<meta name="twitter:image" content="{{ $image }}">
|
||||||
|
|
||||||
<!-- Mastodon proof -->
|
<!-- Mastodon proof -->
|
||||||
<link rel="me" href="https://floss.social/@happyDomain">
|
<link rel="me" href="https://floss.social/@happyDomain">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
<!-- Variable fonts (Hanken Grotesk, JetBrains Mono, Quicksand) — served from node_modules via Hugo mounts -->
|
||||||
<link rel="stylesheet" href="/icons/font/bootstrap-icons.min.css">
|
<link rel="stylesheet" href="/fonts/hanken-grotesk/wght.css">
|
||||||
|
<link rel="stylesheet" href="/fonts/jetbrains-mono/wght.css">
|
||||||
|
<link rel="stylesheet" href="/fonts/quicksand/wght.css">
|
||||||
|
|
||||||
<!-- Theme stylesheet, if possible do not edit this stylesheet -->
|
<!-- Bootstrap (compiled from SCSS) -->
|
||||||
{{ if and (isset .Site.Params "style") .Site.Params.style }}
|
{{ $scss := resources.Get "scss/bootstrap.scss" }}
|
||||||
<link href="{{ .Site.BaseURL }}css/style.{{ .Site.Params.style }}.css" rel="stylesheet" id="theme-stylesheet">
|
{{ $opts := dict "transpiler" "libsass" "includePaths" (slice "node_modules") }}
|
||||||
{{ else }}
|
{{ $css := $scss | css.Sass $opts }}
|
||||||
<link href="{{ .Site.BaseURL }}css/style.default.css" rel="stylesheet" id="theme-stylesheet">
|
{{ if hugo.IsProduction }}
|
||||||
{{ end }}
|
{{ $css = $css | minify | fingerprint }}
|
||||||
|
{{ end }}
|
||||||
|
<link rel="stylesheet" href="{{ $css.RelPermalink }}">
|
||||||
|
|
||||||
<!-- Custom stylesheet - for your changes -->
|
<link rel="stylesheet" href="/icons/font/bootstrap-icons.min.css">
|
||||||
<link href="{{ .Site.BaseURL }}css/custom.css" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- Responsivity for older IE -->
|
<!-- Custom stylesheet - for your changes -->
|
||||||
{{ `
|
<link href="{{ .Site.BaseURL }}css/custom.css" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Responsivity for older IE -->
|
||||||
|
{{ `
|
||||||
<!--[if lt IE 9]>
|
<!--[if lt IE 9]>
|
||||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
` | safeHTML }}
|
` | safeHTML }}
|
||||||
|
|
||||||
<!-- Favicon and apple touch icons-->
|
<!-- Favicon and apple touch icons-->
|
||||||
<link rel="shortcut icon" href="{{ .Site.BaseURL }}img/favicon.ico" type="image/x-icon" />
|
<link rel="shortcut icon" href="{{ .Site.BaseURL }}img/favicon.ico" type="image/x-icon" />
|
||||||
<link rel="apple-touch-icon" href="{{ .Site.BaseURL }}img/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" href="{{ .Site.BaseURL }}img/apple-touch-icon.png" />
|
||||||
|
|
||||||
<link rel="alternate" href="{{ "/index.xml" | absURL }}" type="application/rss+xml" title="{{ .Site.Title }}">
|
<link rel="alternate" href="{{ "/index.xml" | absURL }}" type="application/rss+xml" title="{{ .Site.Title }}">
|
||||||
|
|
||||||
<!-- Structured Data (JSON-LD) -->
|
<!-- Structured Data (JSON-LD) -->
|
||||||
{{ if .IsHome }}
|
{{ if .IsHome }}
|
||||||
<script type="application/ld+json">
|
<script type="application/ld+json">
|
||||||
{
|
{
|
||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@graph": [
|
"@graph": [
|
||||||
{
|
{
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
"@id": "{{ .Site.BaseURL }}#organization",
|
"@id": "{{ .Site.BaseURL }}#organization",
|
||||||
"name": "happyDomain",
|
"name": "happyDomain",
|
||||||
"url": "{{ .Site.BaseURL }}",
|
"url": "{{ .Site.BaseURL }}",
|
||||||
"logo": {
|
"logo": {
|
||||||
"@type": "ImageObject",
|
"@type": "ImageObject",
|
||||||
"url": "{{ .Site.BaseURL }}img/happydomain.png"
|
"url": "{{ .Site.BaseURL }}img/happydomain.png"
|
||||||
},
|
},
|
||||||
"sameAs": [
|
"sameAs": [
|
||||||
"https://floss.social/@happyDomain",
|
"https://floss.social/@happyDomain",
|
||||||
"https://github.com/happyDomain/happydomain",
|
"https://github.com/happyDomain/happydomain",
|
||||||
"https://framagit.org/happyDomain/happydomain"
|
"https://framagit.org/happyDomain/happydomain"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"@type": "WebSite",
|
"@type": "WebSite",
|
||||||
"@id": "{{ .Site.BaseURL }}#website",
|
"@id": "{{ .Site.BaseURL }}#website",
|
||||||
"name": "happyDomain",
|
"name": "happyDomain",
|
||||||
"url": "{{ .Site.BaseURL }}",
|
"url": "{{ .Site.BaseURL }}",
|
||||||
"description": "{{ $description }}",
|
"description": "{{ $description }}",
|
||||||
"inLanguage": ["en", "fr"],
|
"inLanguage": ["en", "fr"],
|
||||||
"publisher": {
|
"publisher": {
|
||||||
"@id": "{{ .Site.BaseURL }}#organization"
|
"@id": "{{ .Site.BaseURL }}#organization"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "SoftwareApplication",
|
||||||
|
"@id": "{{ .Site.BaseURL }}#software",
|
||||||
|
"name": "happyDomain",
|
||||||
|
"url": "{{ .Site.BaseURL }}",
|
||||||
|
"description": "{{ $description }}",
|
||||||
|
"applicationCategory": "DeveloperApplication",
|
||||||
|
"operatingSystem": "Linux, Windows, macOS, Docker",
|
||||||
|
"license": "https://www.gnu.org/licenses/agpl-3.0.html",
|
||||||
|
"offers": {
|
||||||
|
"@type": "Offer",
|
||||||
|
"price": "0",
|
||||||
|
"priceCurrency": "USD"
|
||||||
|
},
|
||||||
|
"screenshot": "{{ .Site.BaseURL }}img/og.webp",
|
||||||
|
"softwareHelp": {
|
||||||
|
"@type": "WebPage",
|
||||||
|
"url": "https://help.happydomain.org/"
|
||||||
|
},
|
||||||
|
"author": {
|
||||||
|
"@id": "{{ .Site.BaseURL }}#organization"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
</script>
|
||||||
{
|
{{ end }}
|
||||||
"@type": "SoftwareApplication",
|
|
||||||
"@id": "{{ .Site.BaseURL }}#software",
|
|
||||||
"name": "happyDomain",
|
|
||||||
"url": "{{ .Site.BaseURL }}",
|
|
||||||
"description": "{{ $description }}",
|
|
||||||
"applicationCategory": "DeveloperApplication",
|
|
||||||
"operatingSystem": "Linux, Windows, macOS, Docker",
|
|
||||||
"license": "https://www.gnu.org/licenses/agpl-3.0.html",
|
|
||||||
"offers": {
|
|
||||||
"@type": "Offer",
|
|
||||||
"price": "0",
|
|
||||||
"priceCurrency": "USD"
|
|
||||||
},
|
|
||||||
"screenshot": "{{ .Site.BaseURL }}img/og.webp",
|
|
||||||
"softwareHelp": {
|
|
||||||
"@type": "WebPage",
|
|
||||||
"url": "https://help.happydomain.org/"
|
|
||||||
},
|
|
||||||
"author": {
|
|
||||||
"@id": "{{ .Site.BaseURL }}#organization"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<script async defer data-website-id="a10b2ee8-ed13-4acb-a017-0b9a661f31c3" src="https://pythagore.p0m.fr/pythagore.js"></script>
|
<script async defer data-website-id="a10b2ee8-ed13-4acb-a017-0b9a661f31c3" src="https://pythagore.p0m.fr/pythagore.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,151 @@
|
||||||
<section class="jumbotron mt-n1 mb-0" style="background: linear-gradient(135deg, var(--primary-ultralight) 0%, white 100%)">
|
<style>
|
||||||
<div class="container-fluid">
|
.jumbo-hero {
|
||||||
<div class="row">
|
padding: 8rem 0 5rem;
|
||||||
<div class="col-md-3 d-flex flex-column mb-5 align-items-center">
|
background: linear-gradient(135deg, var(--hd-accent-subtle, #f0fdf4) 0%, var(--hd-bg-canvas, white) 60%);
|
||||||
<img src="/img/screenshots/happydomain-rounded.webp" alt="happyDomain logo" style="width: 100%; max-width: 40vw">
|
}
|
||||||
</div>
|
.hero-eyebrow {
|
||||||
<div class="col">
|
display: flex;
|
||||||
<div class="row">
|
align-items: center;
|
||||||
<div class="col col-sm-8 offset-sm-2 col-md-10 offset-md-1 col-xl-8 offset-xl-2">
|
flex-wrap: wrap;
|
||||||
<h2 class="display-4 text-center text-dark font-weight-bold">
|
gap: .75rem;
|
||||||
{{ i18n "slogan" | safeHTML }}
|
margin-bottom: 1.5rem;
|
||||||
</h2>
|
font-size: .875rem;
|
||||||
</div>
|
color: var(--hd-fg-3, #6b7280);
|
||||||
</div>
|
}
|
||||||
<p class="mt-5 lead text-center text-muted">
|
.hero-eyebrow .badge-os {
|
||||||
happy<strong>Domain</strong>
|
display: inline-flex;
|
||||||
{{ i18n "lead" | markdownify }}
|
align-items: center;
|
||||||
</p>
|
gap: .35rem;
|
||||||
<div class="mt-5 py-2 d-none d-md-flex justify-content-center">
|
padding: .25em .75em;
|
||||||
<a class="btn btn-lg btn-primary px-4 mr-3" data-umami-event="jumbo-tryit" href="{{ .Site.Params.tryit }}?lang={{ .Language }}" style="border-radius: 2em">{{ i18n "tryit" }} »</a>
|
background: var(--hd-accent-subtle, #f0fdf4);
|
||||||
<a class="btn btn-lg btn-outline-secondary px-4 ml-3" data-umami-event="jumbo-downloads" href="#downloads" style="border-radius: 2em">{{ i18n "downloadit" }}</a>
|
border: 1px solid var(--hd-accent, #22c55e);
|
||||||
</div>
|
border-radius: 2em;
|
||||||
<div class="container mt-5 py-2 d-flex d-md-none flex-column justify-content-center">
|
color: var(--hd-accent, #22c55e);
|
||||||
<a class="btn btn-lg btn-primary px-4 mb-3" data-umami-event="jumbo-tryit" href="{{ .Site.Params.tryit }}?lang={{ .Language }}" style="border-radius: 2em">{{ i18n "tryit" }} »</a>
|
font-weight: 600;
|
||||||
<a class="btn btn-lg btn-outline-secondary px-4" data-umami-event="jumbo-downloads" href="#downloads" style="border-radius: 2em">{{ i18n "downloadit" }}</a>
|
font-size: .8rem;
|
||||||
</div>
|
}
|
||||||
|
.hero-meta {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 1rem;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
font-size: .875rem;
|
||||||
|
color: var(--hd-fg-3, #6b7280);
|
||||||
|
}
|
||||||
|
.hero-meta .check { color: var(--hd-accent, #22c55e); margin-right: .25rem; }
|
||||||
|
/* Browser mockup */
|
||||||
|
.hero-stack { position: relative; }
|
||||||
|
.hero-stack .browser:last-child {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0; right: 0;
|
||||||
|
width: 86%;
|
||||||
|
z-index: 0;
|
||||||
|
opacity: .45;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.hero-stack .browser:first-child { position: relative; z-index: 1; }
|
||||||
|
.browser {
|
||||||
|
background: var(--hd-bg-canvas, #fff);
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 16px 48px rgba(0,0,0,.12);
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid var(--hd-border, #e5e7eb);
|
||||||
|
}
|
||||||
|
.browser-bar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: .75rem;
|
||||||
|
padding: .55rem 1rem;
|
||||||
|
background: var(--hd-bg-subtle, #f9fafb);
|
||||||
|
border-bottom: 1px solid var(--hd-border, #e5e7eb);
|
||||||
|
}
|
||||||
|
.browser-dots { display: flex; gap: 5px; }
|
||||||
|
.browser-dots span { width: 10px; height: 10px; border-radius: 50%; background: var(--hd-border, #e5e7eb); }
|
||||||
|
.browser-url {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: .01rem;
|
||||||
|
background: var(--hd-bg-canvas, #fff);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: .22rem .6rem;
|
||||||
|
font-size: .75rem;
|
||||||
|
color: var(--hd-fg-3, #6b7280);
|
||||||
|
}
|
||||||
|
.browser-url .lock { color: var(--hd-accent, #22c55e); font-size: .7rem; }
|
||||||
|
</style>
|
||||||
|
|
||||||
<!--div class="mt-5 card bg-secondary text-light flex-row align-items-center" style="border-radius: .3rem">
|
<section class="jumbo-hero">
|
||||||
<div class="card-body">
|
<div class="container">
|
||||||
<h3>{{ i18n "conf-fosdem24-title" }}</h3>
|
<div class="row align-items-center g-5">
|
||||||
<p class="card-text">
|
|
||||||
{{ i18n "conf-fosdem24-body-1" }}
|
|
||||||
<a href="{{ i18n "conf-fosdem24-href" }}" target="_blank" rel="noopener"><em>{{ i18n "conf-fosdem24-link" }}</em></a>
|
|
||||||
{{ i18n "conf-fosdem24-body-2" }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<img src="/img/assets/FOSDEM24_logo.png" alt="FOSDEM 2024" style="height: 10em">
|
|
||||||
</div-->
|
|
||||||
|
|
||||||
</div>
|
<!-- Copy column -->
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<a class="hero-eyebrow" href="https://git.happydomain.org/" target="_blank">
|
||||||
|
<span class="badge-os"><i class="bi bi-git"></i> Open source</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<h1 class="display-4 fw-bold mb-5" style="text-wrap: balance">
|
||||||
|
{{ i18n "slogan" | safeHTML }}
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="lead mb-5 pb-2">
|
||||||
|
happy<strong>Domain</strong> {{ i18n "lead" | markdownify }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="d-flex flex-wrap gap-3">
|
||||||
|
<a
|
||||||
|
class="btn btn-lg btn-primary px-4"
|
||||||
|
data-umami-event="jumbo-tryit"
|
||||||
|
href="{{ .Site.Params.tryit }}?lang={{ .Language }}"
|
||||||
|
>
|
||||||
|
{{ i18n "tryit" }} <i class="bi bi-arrow-right"></i>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
class="btn btn-lg btn-outline-dark px-4"
|
||||||
|
data-umami-event="jumbo-downloads"
|
||||||
|
href="#downloads"
|
||||||
|
>
|
||||||
|
<i class="bi bi-box-seam"></i> {{ i18n "downloadit" }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hero-meta">
|
||||||
|
<span><i class="bi bi-check2 check"></i><strong>No account</strong> needed for the demo</span>
|
||||||
|
<span><i class="bi bi-check2 check"></i><strong>~30s</strong> to first zone</span>
|
||||||
|
<span><i class="bi bi-check2 check"></i><strong>55+</strong> providers</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Visual column -->
|
||||||
|
<div class="col-lg-7 d-none d-lg-block">
|
||||||
|
<div class="hero-stack">
|
||||||
|
<!-- Front browser frame: zone editor -->
|
||||||
|
<div class="browser">
|
||||||
|
<div class="browser-bar">
|
||||||
|
<div class="browser-dots"><span></span><span></span><span></span></div>
|
||||||
|
<div class="browser-url">
|
||||||
|
<i class="bi bi-lock-fill lock me-1"></i>
|
||||||
|
<span>app.</span><strong>happydomain.org</strong><span>/zone/happydomain.org</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img
|
||||||
|
src="/img/screenshots/domain-abstract.webp"
|
||||||
|
alt="happyDomain zone editor"
|
||||||
|
style="width:100%;display:block"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<!-- Back browser frame, peeking -->
|
||||||
|
<div class="browser" aria-hidden="true">
|
||||||
|
<div class="browser-bar">
|
||||||
|
<div class="browser-dots"><span></span><span></span><span></span></div>
|
||||||
|
<div class="browser-url"><i class="bi bi-lock-fill lock"></i><span>try.</span><strong>happydomain.org</strong></div>
|
||||||
|
</div>
|
||||||
|
<div style="padding:14px 16px;height:120px;background:var(--hd-bg-subtle,#f9fafb)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
51
layouts/partials/logo.html
Normal file
51
layouts/partials/logo.html
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
{{- $height := .height | default "25" -}}
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
viewBox="7 5 100 15"
|
||||||
|
aria-labelledby="title"
|
||||||
|
height="{{ $height }}"
|
||||||
|
>
|
||||||
|
<title>happyDomain</title>
|
||||||
|
<g
|
||||||
|
fill="currentColor"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width=".4"
|
||||||
|
aria-label="happy"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="m7.1613 5.7392h0.28939v4.2106q2.59-0.96945 3.9791-0.96945 0.77412 0 1.172 0.30386 0.709 0.53537 0.709 2.0257v4.8907h-0.28939v-4.8907q0-1.3457-0.59325-1.7942-0.36174-0.27492-1.0563-0.27492-0.57878 0-1.3746 0.1881-0.88264 0.20981-2.5466 0.83199v5.9397h-0.28939z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m21.175 12.721h-2.7781q-1.1214 0-1.6929 0.24598-0.82476 0.36174-0.82476 1.3095 0 0.79582 0.5209 1.2299 0.49196 0.41238 1.3022 0.41238h0.0217q0.83923 0 1.8231-0.60772 0.34003-0.20981 0.83923-0.57878 0.709-0.52813 0.78858-0.57878zm2.496 3.0748q-0.3762 0.44132-1.0852 0.44132-0.67283 0-1.0418-0.39068-0.36897-0.39067-0.36897-1.0635v-0.28215q-1.3674 0.99116-1.6206 1.1431-0.96222 0.56431-1.8304 0.56431h-0.0217q-0.93328 0-1.5048-0.49196-0.60772-0.52813-0.60772-1.4397 0-1.0852 0.90434-1.5265 0.65836-0.31833 1.9027-0.31833h2.7781v-1.0635q0-1.0056-0.29662-1.3529-0.67283-0.78858-2.3875-0.78858-0.78135 0-1.3963 0.29662-0.74518 0.34727-0.94051 1.0129l-0.27492-0.07958q0.22428-0.76688 1.0346-1.172 0.69453-0.34727 1.5772-0.34727 1.8449 0 2.6117 0.88987 0.3545 0.42685 0.3545 1.541v3.4148q0.0072 1.1648 1.1286 1.1648 0.57878 0 0.86817-0.34003z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m25.27 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m34.241 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m49 16.627q-0.1881 1.3891-1.0707 2.1559-0.91157 0.78858-2.4092 0.78858-1.1141-0.0072-2.033-0.42685-1.0635-0.49196-1.4759-1.3963l0.26045-0.12299q0.37621 0.83199 1.3746 1.2733 0.8537 0.38344 1.8738 0.38344 1.3818 0 2.2066-0.709 0.80305-0.6873 0.97669-1.9534 0.05064-0.32556 0.05064-0.88264v-0.49196q-1.7074 0.62942-2.6551 0.83923-0.709 0.15193-1.2588 0.15193-0.80305 0-1.2444-0.3328-0.70177-0.52813-0.70177-2.0257v-4.8762h0.28215v4.8762q0 1.3529 0.59325 1.7942 0.36174 0.27492 1.0563 0.27492 0.57878 0 1.3818-0.1881 0.88264-0.20257 2.5466-0.82476v-5.9325h0.28215v6.6921q0 0.60048-0.03617 0.93328z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<g fill="currentColor" aria-label="Domain">
|
||||||
|
<path
|
||||||
|
d="m 53.228042,15.362291 h 1.938901 q 1.960602,0 2.966225,-0.940511 0.983919,-0.911573 0.983919,-2.684074 0,-1.786971 -0.991153,-2.749186 -1.020093,-0.991154 -2.987931,-0.991154 h -1.909961 z m 1.909961,-8.949325 q 2.626196,0 4.10931,1.439706 1.47588,1.425236 1.47588,3.885034 0,2.452563 -1.49035,3.841626 -1.475878,1.367358 -4.09484,1.367358 h -3.516064 v -10.533724 z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m 62.228011,13.125048 q 0,-1.779737 1.070734,-2.814299 1.085204,-1.056266 2.973461,-1.056266 1.888258,0.0072 2.966228,1.056266 1.077971,1.041797 1.077971,2.814299 0,1.772501 -1.077971,2.807063 -1.07797,1.049032 -2.966228,1.049032 -1.88102,0 -2.973461,-1.041797 -1.070734,-1.049031 -1.070734,-2.814298 z m 1.598866,0 q 0,1.099674 0.593246,1.671215 0.622184,0.60048 1.852083,0.60048 1.2299,0 1.84485,-0.60048 0.593246,-0.571541 0.593246,-1.671215 0,-1.10691 -0.593246,-1.685686 -0.61495,-0.593245 -1.852083,-0.60048 -1.222666,0 -1.84485,0.60048 -0.593246,0.578776 -0.593246,1.685686 z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m 73.66607,16.957892 h -1.606103 v -7.668782 h 1.606103 v 0.83199 q 0.687297,-0.535368 1.606105,-0.72347 0.708999,-0.144694 1.273307,-0.144694 0.947746,0 1.519285,0.426847 0.470258,0.340031 0.61495,0.600481 0.904338,-0.658358 1.786972,-0.853695 0.788583,-0.173633 1.396297,-0.173633 0.954981,0 1.526521,0.419613 0.918808,0.665592 0.918808,2.315104 v 4.970239 h -1.606103 v -4.970239 q 0,-0.84646 -0.267684,-1.041797 -0.144695,-0.10852 -0.557072,-0.10852 -0.470255,0 -1.172023,0.166398 -0.998386,0.340031 -1.729091,0.933276 v 5.020882 h -1.613339 v -4.970239 q 0,-0.84646 -0.260448,-1.041797 -0.151929,-0.115755 -0.557073,-0.115755 -0.448553,0 -1.09244,0.151929 -0.759643,0.173632 -1.786972,0.824756 z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m 91.051057,14.051772 -1.996779,-0.166398 q -0.954979,0 -1.381828,0.166398 -0.376203,0.151929 -0.376203,0.535368 0,0.368969 0.24598,0.549837 0.289388,0.23151 0.839224,0.23151 h 0.0217 q 0.62942,0 1.425236,-0.405143 0.376206,-0.224275 1.222666,-0.651123 z m 3.935677,2.286165 q -0.752409,0.593246 -1.917197,0.636654 -0.911572,0 -1.46141,-0.528133 -0.245978,-0.238745 -0.383437,-0.542603 -0.477491,0.325562 -0.745175,0.470256 -1.070737,0.578776 -2.07636,0.578776 h -0.0217 q -1.121378,0 -1.852083,-0.578776 -0.839224,-0.665593 -0.839224,-1.786971 0,-1.389063 1.266071,-1.953369 0.759645,-0.332797 2.098063,-0.332797 l 1.996779,0.311092 v -0.643888 q 0,-1.157552 -1.700157,-1.157552 -1.418,0 -2.604492,0.911572 l -0.860928,-1.215429 q 0.549836,-0.499195 1.46141,-0.918807 0.80305,-0.36897 1.794206,-0.36897 2.061887,0 2.995165,0.998389 0.520899,0.571541 0.520899,1.808675 v 3.002401 q 0.0072,0.361734 0.419613,0.434082 h 0.07958 q 0.535365,0 1.157552,-0.405144 z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m 96.448142,6.566922 q 0.368969,0 0.636653,0.24598 0.289388,0.267684 0.289388,0.658358 0,0.390674 -0.289388,0.658358 -0.267684,0.245979 -0.636653,0.245979 -0.347266,0 -0.629418,-0.238745 -0.303858,-0.274918 -0.303858,-0.665592 0,-0.390674 0.303858,-0.672827 0.282152,-0.231511 0.629418,-0.231511 z m -0.80305,10.38903 v -7.668782 h 1.598869 v 7.668782 z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m 100.803432,16.957892 h -1.598869 v -7.668782 h 1.598869 v 0.774113 q 0.803053,-0.477491 1.758032,-0.665593 0.752409,-0.144694 1.345655,-0.144694 0.969449,0 1.562695,0.405143 0.969446,0.672828 0.969446,2.329574 v 4.970239 h -1.6061 v -4.970239 q 0,-0.831991 -0.289388,-1.034562 -0.173632,-0.12299 -0.636653,-0.12299 -0.477491,0 -1.179256,0.151929 -0.810287,0.180867 -1.924431,0.759643 z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
@ -1,57 +1,97 @@
|
||||||
<nav class="navbar navbar-expand-md sticky-top navbar-light bg-light" id="mainnav">
|
<nav class="navbar navbar-expand-md fixed-top" id="mainnav">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a class="h1 navbar-brand mb-0" href="/{{ .Site.Language.Lang }}/">
|
<a
|
||||||
<svg version="1.1" viewBox="7 5 100 15" aria-labelledby="title" height="25">
|
class="h1 navbar-brand d-flex align-items-top gap-2 mb-0"
|
||||||
<title>happyDomain</title>
|
href="/{{ .Site.Language.Lang }}/"
|
||||||
<g fill="#000" stroke="#000" stroke-width=".4" aria-label="happy"><path d="m7.1613 5.7392h0.28939v4.2106q2.59-0.96945 3.9791-0.96945 0.77412 0 1.172 0.30386 0.709 0.53537 0.709 2.0257v4.8907h-0.28939v-4.8907q0-1.3457-0.59325-1.7942-0.36174-0.27492-1.0563-0.27492-0.57878 0-1.3746 0.1881-0.88264 0.20981-2.5466 0.83199v5.9397h-0.28939z" /><path d="m21.175 12.721h-2.7781q-1.1214 0-1.6929 0.24598-0.82476 0.36174-0.82476 1.3095 0 0.79582 0.5209 1.2299 0.49196 0.41238 1.3022 0.41238h0.0217q0.83923 0 1.8231-0.60772 0.34003-0.20981 0.83923-0.57878 0.709-0.52813 0.78858-0.57878zm2.496 3.0748q-0.3762 0.44132-1.0852 0.44132-0.67283 0-1.0418-0.39068-0.36897-0.39067-0.36897-1.0635v-0.28215q-1.3674 0.99116-1.6206 1.1431-0.96222 0.56431-1.8304 0.56431h-0.0217q-0.93328 0-1.5048-0.49196-0.60772-0.52813-0.60772-1.4397 0-1.0852 0.90434-1.5265 0.65836-0.31833 1.9027-0.31833h2.7781v-1.0635q0-1.0056-0.29662-1.3529-0.67283-0.78858-2.3875-0.78858-0.78135 0-1.3963 0.29662-0.74518 0.34727-0.94051 1.0129l-0.27492-0.07958q0.22428-0.76688 1.0346-1.172 0.69453-0.34727 1.5772-0.34727 1.8449 0 2.6117 0.88987 0.3545 0.42685 0.3545 1.541v3.4148q0.0072 1.1648 1.1286 1.1648 0.57878 0 0.86817-0.34003z" /><path d="m25.27 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z" /><path d="m34.241 14.935q0.98392 1.0129 2.7998 1.0129h0.0217q1.5555 0 2.3875-0.8971 0.82476-0.88264 0.82476-2.4598 0-1.3891-0.61495-2.2862-0.709-1.0346-2.0257-1.0346-1.3746 0-3.3931 0.95498zm0-5.9325v0.90434q1.9606-0.92604 3.3931-0.92604 1.4469 0 2.2355 1.1141 0.69453 0.98392 0.69453 2.496 0 1.7002-0.91157 2.6624-0.92604 0.98392-2.6117 0.98392-1.7291 0-2.7998-0.91157v4.2106h-0.28939v-10.534z" /><path d="m49 16.627q-0.1881 1.3891-1.0707 2.1559-0.91157 0.78858-2.4092 0.78858-1.1141-0.0072-2.033-0.42685-1.0635-0.49196-1.4759-1.3963l0.26045-0.12299q0.37621 0.83199 1.3746 1.2733 0.8537 0.38344 1.8738 0.38344 1.3818 0 2.2066-0.709 0.80305-0.6873 0.97669-1.9534 0.05064-0.32556 0.05064-0.88264v-0.49196q-1.7074 0.62942-2.6551 0.83923-0.709 0.15193-1.2588 0.15193-0.80305 0-1.2444-0.3328-0.70177-0.52813-0.70177-2.0257v-4.8762h0.28215v4.8762q0 1.3529 0.59325 1.7942 0.36174 0.27492 1.0563 0.27492 0.57878 0 1.3818-0.1881 0.88264-0.20257 2.5466-0.82476v-5.9325h0.28215v6.6921q0 0.60048-0.03617 0.93328z" /></g>
|
>
|
||||||
<g fill="#000" aria-label="Domain"><path d="m 53.228042,15.362291 h 1.938901 q 1.960602,0 2.966225,-0.940511 0.983919,-0.911573 0.983919,-2.684074 0,-1.786971 -0.991153,-2.749186 -1.020093,-0.991154 -2.987931,-0.991154 h -1.909961 z m 1.909961,-8.949325 q 2.626196,0 4.10931,1.439706 1.47588,1.425236 1.47588,3.885034 0,2.452563 -1.49035,3.841626 -1.475878,1.367358 -4.09484,1.367358 h -3.516064 v -10.533724 z" /><path d="m 62.228011,13.125048 q 0,-1.779737 1.070734,-2.814299 1.085204,-1.056266 2.973461,-1.056266 1.888258,0.0072 2.966228,1.056266 1.077971,1.041797 1.077971,2.814299 0,1.772501 -1.077971,2.807063 -1.07797,1.049032 -2.966228,1.049032 -1.88102,0 -2.973461,-1.041797 -1.070734,-1.049031 -1.070734,-2.814298 z m 1.598866,0 q 0,1.099674 0.593246,1.671215 0.622184,0.60048 1.852083,0.60048 1.2299,0 1.84485,-0.60048 0.593246,-0.571541 0.593246,-1.671215 0,-1.10691 -0.593246,-1.685686 -0.61495,-0.593245 -1.852083,-0.60048 -1.222666,0 -1.84485,0.60048 -0.593246,0.578776 -0.593246,1.685686 z" /><path d="m 73.66607,16.957892 h -1.606103 v -7.668782 h 1.606103 v 0.83199 q 0.687297,-0.535368 1.606105,-0.72347 0.708999,-0.144694 1.273307,-0.144694 0.947746,0 1.519285,0.426847 0.470258,0.340031 0.61495,0.600481 0.904338,-0.658358 1.786972,-0.853695 0.788583,-0.173633 1.396297,-0.173633 0.954981,0 1.526521,0.419613 0.918808,0.665592 0.918808,2.315104 v 4.970239 h -1.606103 v -4.970239 q 0,-0.84646 -0.267684,-1.041797 -0.144695,-0.10852 -0.557072,-0.10852 -0.470255,0 -1.172023,0.166398 -0.998386,0.340031 -1.729091,0.933276 v 5.020882 h -1.613339 v -4.970239 q 0,-0.84646 -0.260448,-1.041797 -0.151929,-0.115755 -0.557073,-0.115755 -0.448553,0 -1.09244,0.151929 -0.759643,0.173632 -1.786972,0.824756 z" /><path d="m 91.051057,14.051772 -1.996779,-0.166398 q -0.954979,0 -1.381828,0.166398 -0.376203,0.151929 -0.376203,0.535368 0,0.368969 0.24598,0.549837 0.289388,0.23151 0.839224,0.23151 h 0.0217 q 0.62942,0 1.425236,-0.405143 0.376206,-0.224275 1.222666,-0.651123 z m 3.935677,2.286165 q -0.752409,0.593246 -1.917197,0.636654 -0.911572,0 -1.46141,-0.528133 -0.245978,-0.238745 -0.383437,-0.542603 -0.477491,0.325562 -0.745175,0.470256 -1.070737,0.578776 -2.07636,0.578776 h -0.0217 q -1.121378,0 -1.852083,-0.578776 -0.839224,-0.665593 -0.839224,-1.786971 0,-1.389063 1.266071,-1.953369 0.759645,-0.332797 2.098063,-0.332797 l 1.996779,0.311092 v -0.643888 q 0,-1.157552 -1.700157,-1.157552 -1.418,0 -2.604492,0.911572 l -0.860928,-1.215429 q 0.549836,-0.499195 1.46141,-0.918807 0.80305,-0.36897 1.794206,-0.36897 2.061887,0 2.995165,0.998389 0.520899,0.571541 0.520899,1.808675 v 3.002401 q 0.0072,0.361734 0.419613,0.434082 h 0.07958 q 0.535365,0 1.157552,-0.405144 z" /><path d="m 96.448142,6.566922 q 0.368969,0 0.636653,0.24598 0.289388,0.267684 0.289388,0.658358 0,0.390674 -0.289388,0.658358 -0.267684,0.245979 -0.636653,0.245979 -0.347266,0 -0.629418,-0.238745 -0.303858,-0.274918 -0.303858,-0.665592 0,-0.390674 0.303858,-0.672827 0.282152,-0.231511 0.629418,-0.231511 z m -0.80305,10.38903 v -7.668782 h 1.598869 v 7.668782 z" /><path d="m 100.803432,16.957892 h -1.598869 v -7.668782 h 1.598869 v 0.774113 q 0.803053,-0.477491 1.758032,-0.665593 0.752409,-0.144694 1.345655,-0.144694 0.969449,0 1.562695,0.405143 0.969446,0.672828 0.969446,2.329574 v 4.970239 h -1.6061 v -4.970239 q 0,-0.831991 -0.289388,-1.034562 -0.173632,-0.12299 -0.636653,-0.12299 -0.477491,0 -1.179256,0.151929 -0.810287,0.180867 -1.924431,0.759643 z" /></g>
|
<img src="/img/apple-touch-icon.png" alt="" style="height: 24px" />
|
||||||
</svg>
|
{{ partial "logo.html" (dict "height" "25") }}
|
||||||
</a>
|
</a>
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
<button
|
||||||
<span class="navbar-toggler-icon"></span>
|
class="navbar-toggler"
|
||||||
</button>
|
type="button"
|
||||||
<div class="collapse navbar-collapse justify-content-between" id="navbarCollapse">
|
data-bs-toggle="collapse"
|
||||||
<ul class="navbar-nav">
|
data-bs-target="#navbarCollapse"
|
||||||
{{ range .Site.Menus.main }}
|
aria-controls="navbarCollapse"
|
||||||
{{ if .HasChildren }}
|
aria-expanded="false"
|
||||||
<li class="nav-item dropdown">
|
aria-label="Toggle navigation"
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
>
|
||||||
{{ .Name }}
|
<span class="navbar-toggler-icon"></span>
|
||||||
</a>
|
</button>
|
||||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
<div
|
||||||
{{ range .Children }}
|
class="collapse navbar-collapse justify-content-between"
|
||||||
<a href="{{ .URL }}" class="dropdown-item">{{ .Name }}</a>
|
id="navbarCollapse"
|
||||||
{{ end }}
|
>
|
||||||
</div>
|
<ul class="navbar-nav">
|
||||||
{{ else }}
|
{{ range .Site.Menus.main }} {{ if .HasChildren }}
|
||||||
<li class="nav-item">
|
<li class="nav-item dropdown">
|
||||||
<a href="{{ .URL }}" class="nav-link">{{ .Name }}</a>
|
<a
|
||||||
{{ end }}
|
class="nav-link dropdown-toggle"
|
||||||
</li>
|
href="#"
|
||||||
{{ end }}
|
id="navbarDropdown"
|
||||||
</ul>
|
role="button"
|
||||||
<div class="d-flex">
|
data-bs-toggle="dropdown"
|
||||||
<div class="nav-item nav-ext-links">
|
aria-haspopup="true"
|
||||||
{{ if .Site.Params.others_links }}
|
aria-expanded="false"
|
||||||
{{ range .Site.Params.others_links }}
|
>
|
||||||
<a href="{{ .href }}" title="{{ .text }}" class="nav-icon-link {{ .class }}" data-umami-event="nav-{{ .id }}">
|
{{ .Name }}
|
||||||
<i class="bi {{ .icon }}"></i>
|
</a>
|
||||||
{{ .text }}
|
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||||
</a>
|
{{ range .Children }}
|
||||||
{{ end }}
|
<a href="{{ .URL }}" class="dropdown-item"
|
||||||
{{ end }}
|
>{{ .Name }}</a
|
||||||
|
>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ else }}
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a href="{{ .URL }}" class="nav-link">{{ .Name }}</a>
|
||||||
|
{{ end }}
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
<div class="nav-item dropdown">
|
||||||
|
<a
|
||||||
|
class="btn btn-sm btn-outline-secondary dropdown-toggle"
|
||||||
|
href="#"
|
||||||
|
id="navbarLangDropdown"
|
||||||
|
role="button"
|
||||||
|
data-bs-toggle="dropdown"
|
||||||
|
aria-expanded="false"
|
||||||
|
>
|
||||||
|
<i class="bi bi-translate"></i> {{ .Language.Lang | upper }}
|
||||||
|
</a>
|
||||||
|
<div
|
||||||
|
class="dropdown-menu dropdown-menu-end"
|
||||||
|
aria-labelledby="navbarLangDropdown"
|
||||||
|
>
|
||||||
|
{{ range .Site.Home.AllTranslations }}
|
||||||
|
<a href="{{ .Permalink }}" class="dropdown-item">
|
||||||
|
{{ .Language }}
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="nav-item nav-ext-links">
|
||||||
|
{{ if .Site.Params.others_links }} {{ range
|
||||||
|
.Site.Params.others_links }}
|
||||||
|
<a
|
||||||
|
href="{{ .href }}"
|
||||||
|
title="{{ .text }}"
|
||||||
|
class="nav-icon-link {{ .class }}"
|
||||||
|
data-umami-event="nav-{{ .id }}"
|
||||||
|
>
|
||||||
|
{{ if .icon }}
|
||||||
|
<i class="bi {{ .icon }}"></i>
|
||||||
|
{{ end }}
|
||||||
|
{{ .text }}
|
||||||
|
</a>
|
||||||
|
{{ end }} {{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-item dropdown">
|
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
{{ .Language }}
|
|
||||||
</a>
|
|
||||||
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
|
|
||||||
{{ range .Site.Home.AllTranslations }}
|
|
||||||
<a href="{{ .Permalink }}" class="dropdown-item">{{ .Language }}</a>
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
<script src="/js/jquery.slim.min.js"></script>
|
<script src="/js/bootstrap.bundle.min.js"></script>
|
||||||
<script src="/js/bootstrap.min.js"></script>
|
|
||||||
<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
|
<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener("scroll", function() {
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
|
||||||
if (window.scrollY > 100) {
|
document.documentElement.setAttribute('data-bs-theme', e.matches ? 'dark' : 'light');
|
||||||
document.getElementById('mainnav').classList.add("scrolled");
|
});
|
||||||
} else {
|
window.addEventListener("scroll", function () {
|
||||||
document.getElementById('mainnav').classList.remove("scrolled");
|
if (window.scrollY > 100) {
|
||||||
}
|
document.getElementById("mainnav").classList.add("scrolled");
|
||||||
});
|
} else {
|
||||||
document.getElementById('mainnav').classList.add("beginscroll");
|
document.getElementById("mainnav").classList.remove("scrolled");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
document.getElementById("mainnav").classList.add("beginscroll");
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,36 @@
|
||||||
<div id="voxppl">
|
<div id="voxppl">
|
||||||
<a href="{{ .Site.Params.survey }}" class="d-flex p-3 text-light row" data-umami-event="survey" target="_blank" rel="noopener">
|
<a
|
||||||
<h1 class="col-auto align-self-center m-0 p-0">
|
href="{{ .Site.Params.survey }}"
|
||||||
<div class="circle-head" style="background-color: #430c59; font-size: 1.1em;">
|
class="d-flex p-3 text-light row"
|
||||||
<i class="bi bi-megaphone-fill"></i>
|
data-umami-event="survey"
|
||||||
</div>
|
target="_blank"
|
||||||
</h1>
|
rel="noopener"
|
||||||
<div class="col align-self-center font-weigth-bolder">
|
>
|
||||||
<button type="button" class="close float-right" aria-label="Close" onclick="document.getElementById('voxppl').style.display = 'none'; return false">
|
<h1 class="col-auto align-self-center m-0 p-0">
|
||||||
<span aria-hidden="true">×</span>
|
<div
|
||||||
</button>
|
class="circle-head"
|
||||||
<strong>{{ i18n "survey-title" | markdownify }}</strong><br>
|
style="background-color: #430c59; font-size: 1.1em"
|
||||||
{{ i18n "survey-text" | markdownify }}
|
>
|
||||||
</div>
|
<i class="bi bi-megaphone-fill"></i>
|
||||||
</a>
|
</div>
|
||||||
|
</h1>
|
||||||
|
<div class="col align-self-center font-weigth-bolder">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn-close btn-close-white float-end"
|
||||||
|
aria-label="Close"
|
||||||
|
onclick="
|
||||||
|
document.getElementById('voxppl').style.display = 'none';
|
||||||
|
return false;
|
||||||
|
"
|
||||||
|
></button>
|
||||||
|
<strong>{{ i18n "survey-title" | markdownify }}</strong><br />
|
||||||
|
{{ i18n "survey-text" | markdownify }}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
setTimeout(function() {
|
setTimeout(function () {
|
||||||
document.getElementById('voxppl').style.display = 'block'
|
document.getElementById("voxppl").style.display = "block";
|
||||||
}, 4500)
|
}, 4500);
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,24 @@
|
||||||
{{ if .Site.Params.topbar.enable }}
|
{{ if .Site.Params.topbar.enable }}
|
||||||
<div id="top">
|
<div id="top">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-5">
|
<div class="col-xs-5">
|
||||||
{{ .Site.Params.topbar.text | safeHTML }}
|
{{ .Site.Params.topbar.text | safeHTML }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-7">
|
<div class="col-xs-7">
|
||||||
<div class="social">
|
<div class="social">
|
||||||
{{ range .Site.Menus.topbar.ByWeight }}
|
{{ range .Site.Menus.topbar.ByWeight }}
|
||||||
<a href="{{ .URL }}" target="_blank" rel="noopener" style="opacity: 1;">{{ .Pre }}</a>
|
<a
|
||||||
{{ end }}
|
href="{{ .URL }}"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
style="opacity: 1"
|
||||||
|
>{{ .Pre }}</a
|
||||||
|
>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,13 @@
|
||||||
<div class="container mt-5 mb-4">
|
<div class="container mt-5 mb-4">
|
||||||
<div class="row py-5">
|
<div class="row py-5">
|
||||||
<div class="col-md-10 offset-md-1 col-lg-8 offset-lg-2 col-xl-6 offset-xl-3 text-center">
|
<div class="col-md-10 offset-md-1 col-lg-8 offset-lg-2 col-xl-6 offset-xl-3 text-center">
|
||||||
<h4 class="font-weight-bold mb-3">
|
<h4 class="fw-bold mb-3">
|
||||||
{{ i18n "footer-try-title-line1" }}<br>
|
{{ i18n "footer-try-title-line1" }}<br>
|
||||||
{{ i18n "footer-try-title-line2" }}
|
{{ i18n "footer-try-title-line2" }}
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
happy<span class="font-weight-bold">Domain</span> {{ i18n "footer-try-text" }}
|
happy<span class="fw-bold">Domain</span> {{ i18n "footer-try-text" }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -60,10 +60,10 @@
|
||||||
<div class="container my-4">
|
<div class="container my-4">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="order-0 col-md-5 offset-md-1 align-self-center text-center">
|
<div class="order-0 col-md-5 offset-md-1 align-self-center text-center">
|
||||||
<h3 class="font-weight-bolder">{{ i18n "footer-us-title" }}</h3>
|
<h3 class="fw-bolder">{{ i18n "footer-us-title" }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="order-1 col-md-5">
|
<div class="order-1 col-md-5">
|
||||||
<h4 class="font-weight-bold mb-3">
|
<h4 class="fw-bold mb-3">
|
||||||
{{ i18n "footer-us-text-lead" }}
|
{{ i18n "footer-us-text-lead" }}
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
|
|
|
||||||
18
layouts/partials/work-with.html
Normal file
18
layouts/partials/work-with.html
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<!-- ── Trust strip ──────────────────────────────────────── -->
|
||||||
|
<section class="trust">
|
||||||
|
<div class="container trust-grid">
|
||||||
|
<div class="trust-tag"><span class="dot"></span>Works with</div>
|
||||||
|
<div class="trust-list">
|
||||||
|
<span><i class="bi bi-globe2"></i>OVH</span>
|
||||||
|
<span><i class="bi bi-leaf"></i>Gandi</span>
|
||||||
|
<span><i class="bi bi-droplet"></i>DigitalOcean</span>
|
||||||
|
<span><i class="bi bi-cloud"></i>Cloudflare</span>
|
||||||
|
<span><i class="bi bi-server"></i>Hetzner</span>
|
||||||
|
<span><i class="bi bi-tag"></i>Namecheap</span>
|
||||||
|
<span><i class="bi bi-terminal"></i>BIND</span>
|
||||||
|
<span><i class="bi bi-hdd-network"></i>Knot DNS</span>
|
||||||
|
<span><i class="bi bi-cpu"></i>PowerDNS</span>
|
||||||
|
</div>
|
||||||
|
<a class="trust-more" href="https://app.happydomain.org/providers/features" target="_blank" rel="noopener">+ 46 more →</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
90
package-lock.json
generated
Normal file
90
package-lock.json
generated
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
{
|
||||||
|
"name": "happydomain-website",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "happydomain-website",
|
||||||
|
"dependencies": {
|
||||||
|
"@fontsource-variable/hanken-grotesk": "^5.2.8",
|
||||||
|
"@fontsource-variable/jetbrains-mono": "^5.2.8",
|
||||||
|
"@fontsource-variable/quicksand": "^5.2.10",
|
||||||
|
"bootstrap": "^5.3.0",
|
||||||
|
"bootstrap-icons": "^1.13.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@fontsource-variable/hanken-grotesk": {
|
||||||
|
"version": "5.2.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@fontsource-variable/hanken-grotesk/-/hanken-grotesk-5.2.8.tgz",
|
||||||
|
"integrity": "sha512-K7hu09ZKReBc7EifRLeM4K94NZBrxFEg0nGcISmVwlFQOJo4EmYkLXTWEwr5JcNW4z2hr5zy8vLS2sxC8JDmrQ==",
|
||||||
|
"license": "OFL-1.1",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@fontsource-variable/jetbrains-mono": {
|
||||||
|
"version": "5.2.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz",
|
||||||
|
"integrity": "sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==",
|
||||||
|
"license": "OFL-1.1",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@fontsource-variable/quicksand": {
|
||||||
|
"version": "5.2.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/@fontsource-variable/quicksand/-/quicksand-5.2.10.tgz",
|
||||||
|
"integrity": "sha512-1uzkzGDwWgtFnxquAXuD7fZV9wHkALb49UPzRXxGTVeeLsNrGnIU0O/pcz6m1U7RDtpHz2qx77JhCpKaq7FrUg==",
|
||||||
|
"license": "OFL-1.1",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@popperjs/core": {
|
||||||
|
"version": "2.11.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
||||||
|
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/popperjs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/bootstrap": {
|
||||||
|
"version": "5.3.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
|
||||||
|
"integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/twbs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/bootstrap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@popperjs/core": "^2.11.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/bootstrap-icons": {
|
||||||
|
"version": "1.13.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.13.1.tgz",
|
||||||
|
"integrity": "sha512-ijombt4v6bv5CLeXvRWKy7CuM3TRTuPEuGaGKvTV5cz65rQSY8RQ2JcHt6b90cBBAC7s8fsf2EkQDldzCoXUjw==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/twbs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/bootstrap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
package.json
Normal file
11
package.json
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "happydomain-website",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@fontsource-variable/hanken-grotesk": "^5.2.8",
|
||||||
|
"@fontsource-variable/jetbrains-mono": "^5.2.8",
|
||||||
|
"@fontsource-variable/quicksand": "^5.2.10",
|
||||||
|
"bootstrap": "^5.3.0",
|
||||||
|
"bootstrap-icons": "^1.13.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
static/css/bootstrap.min.css
vendored
1
static/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,86 +1,64 @@
|
||||||
:root {
|
|
||||||
--primary: #1cb487;
|
|
||||||
--primary-dark: #169c73;
|
|
||||||
--primary-light: #5ed1b0;
|
|
||||||
--primary-ultralight: #e7f7f2;
|
|
||||||
--secondary: #360b48;
|
|
||||||
--secondary-dark: #29083a;
|
|
||||||
--secondary-subtle: #871cb4;
|
|
||||||
--secondary-light: #4e1566;
|
|
||||||
--secondary-ultralight: #f0e6f3;
|
|
||||||
--dark: #2c3e50;
|
|
||||||
--light: #f8f9fa;
|
|
||||||
--gray: #6c757d;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Montserrat';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
src: local('Montserrat'), local('Montserrat-Regular'), url(/fonts/Montserrat.woff2) format('woff2');
|
|
||||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: #343a40;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
font-family: Montserrat,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji,sans;
|
|
||||||
}
|
|
||||||
nav.navbar {
|
nav.navbar {
|
||||||
background: var(--light);
|
background: var(--hd-bg-canvas);
|
||||||
box-shadow: 0 0px 3px 0 #1cb487;
|
box-shadow: 0 0px 3px 0 var(--hd-accent);
|
||||||
border-bottom: 1px solid #1cb487;
|
border-bottom: 1px solid var(--hd-accent);
|
||||||
z-index: 1024;
|
z-index: 1024;
|
||||||
transition: background 1s linear;
|
transition: background 1s linear;
|
||||||
}
|
}
|
||||||
nav.navbar.beginscroll {
|
nav.navbar.beginscroll {
|
||||||
background: linear-gradient(90deg, var(--primary-ultralight) 0%, white 150%);
|
background:
|
||||||
|
linear-gradient(90deg, var(--hd-accent-subtle) 0%, white 100%),
|
||||||
|
var(--hd-accent-subtle);
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
nav.navbar.scrolled {
|
nav.navbar.scrolled {
|
||||||
background: var(--light);
|
background: var(--hd-bg-canvas);
|
||||||
box-shadow: 0 0px 3px 0 #1cb487;
|
box-shadow: 0 0px 3px 0 var(--hd-accent);
|
||||||
border-bottom: 1px solid #1cb487;
|
border-bottom: 1px solid var(--hd-accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
a.card {
|
a.card {
|
||||||
background: #f6f7f8;
|
background: var(--hd-bg-subtle);
|
||||||
transition: transform 250ms;
|
transition: transform 250ms;
|
||||||
}
|
}
|
||||||
a.card:hover {
|
a.card:hover {
|
||||||
background: #e9ecef;
|
background: var(--hd-bg-inset);
|
||||||
transform: scale(1.14);
|
transform: scale(1.14);
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-title::after {
|
.section-title::after {
|
||||||
content: '';
|
content: "";
|
||||||
width: 120px;
|
width: 120px;
|
||||||
height: 4px;
|
height: 4px;
|
||||||
background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%);
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
var(--hd-accent) 0%,
|
||||||
|
var(--hd-brand-dark) 100%
|
||||||
|
);
|
||||||
display: block;
|
display: block;
|
||||||
margin: 10px auto 0;
|
margin: 10px auto 0;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-rounded, .circle-head {
|
.link-rounded,
|
||||||
|
.circle-head {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 1.8em;
|
height: 1.8em;
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
width: 1.8em;
|
width: 1.8em;
|
||||||
background: #1cb487;
|
background: var(--hd-accent);
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
color: #f8f9fa;
|
color: var(--hd-accent-fg);
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
}
|
}
|
||||||
.link-rounded:hover {
|
.link-rounded:hover {
|
||||||
background-color: #127255;
|
background-color: var(--hd-green-800);
|
||||||
}
|
}
|
||||||
.link-rounded:hover > div {
|
.link-rounded:hover > div {
|
||||||
color: #f8f9fa;
|
color: var(--hd-accent-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.anchor {
|
.anchor {
|
||||||
|
|
@ -89,7 +67,7 @@ a.card:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
.carousel {
|
.carousel {
|
||||||
background-color: #430c59;
|
background-color: var(--hd-plum-700);
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-hilight {
|
.text-hilight {
|
||||||
|
|
@ -104,37 +82,19 @@ a.card:hover {
|
||||||
bottom: 5vh;
|
bottom: 5vh;
|
||||||
right: 5vw;
|
right: 5vw;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
background-color: #9332bbee;
|
background-color: color-mix(in srgb, var(--hd-plum-400) 93%, transparent);
|
||||||
z-index: 1023;
|
z-index: 1023;
|
||||||
max-width: 98%;
|
max-width: 98%;
|
||||||
}
|
}
|
||||||
#voxppl a:hover {
|
#voxppl a:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: #9332bb;
|
background-color: var(--hd-plum-400);
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#features .card {
|
|
||||||
background-color: white;
|
|
||||||
border-radius: 10px;
|
|
||||||
padding-top: 3px;
|
|
||||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
|
|
||||||
transition: transform 0.3s;
|
|
||||||
border-top: 4px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#features .col:nth-child(even) .card {
|
|
||||||
border-top: 4px solid var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#features .card:hover {
|
|
||||||
transform: translateY(-10px);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#discover .steps {
|
#discover .steps {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
@ -144,13 +104,17 @@ img {
|
||||||
}
|
}
|
||||||
|
|
||||||
#discover .steps::before {
|
#discover .steps::before {
|
||||||
content: '';
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 25px;
|
top: 25px;
|
||||||
left: 10%;
|
left: 10%;
|
||||||
width: 80%;
|
width: 80%;
|
||||||
height: 2px;
|
height: 2px;
|
||||||
background: linear-gradient(to right, var(--primary) 0%, var(--secondary) 100%);
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
var(--hd-accent) 0%,
|
||||||
|
var(--hd-brand-dark) 100%
|
||||||
|
);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -162,7 +126,11 @@ img {
|
||||||
}
|
}
|
||||||
|
|
||||||
#discover .step-number {
|
#discover .step-number {
|
||||||
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
|
background: linear-gradient(
|
||||||
|
135deg,
|
||||||
|
var(--hd-accent) 0%,
|
||||||
|
var(--hd-brand-dark) 100%
|
||||||
|
);
|
||||||
color: white;
|
color: white;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
|
|
@ -181,20 +149,25 @@ img {
|
||||||
}
|
}
|
||||||
|
|
||||||
#discover .step p {
|
#discover .step p {
|
||||||
color: var(--gray);
|
color: var(--hd-fg-3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#cta {
|
#cta {
|
||||||
padding: 100px 0;
|
padding: 100px 0;
|
||||||
background: linear-gradient(135deg, var(--secondary) 0%, var(--primary) 100%);
|
background: linear-gradient(
|
||||||
|
135deg,
|
||||||
|
var(--hd-brand-dark) 0%,
|
||||||
|
var(--hd-accent) 100%
|
||||||
|
);
|
||||||
color: white;
|
color: white;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
#cta::before, #cta::after {
|
#cta::before,
|
||||||
content: '';
|
#cta::after {
|
||||||
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
height: 300px;
|
height: 300px;
|
||||||
|
|
@ -224,43 +197,225 @@ img {
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
border-top: 3px solid #9332bb;
|
border-top: 3px solid var(--hd-plum-400);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-tagline {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: rgba(255, 255, 255, 0.5);
|
||||||
|
line-height: 1.55;
|
||||||
|
max-width: 260px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-heading {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: rgba(255, 255, 255, 0.45);
|
||||||
|
margin-bottom: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-links {
|
.footer-links {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
.footer-links li {
|
gap: 8px;
|
||||||
margin-bottom: 12px;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-links a {
|
.footer-links a {
|
||||||
color: rgba(255, 255, 255, 0.7);
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
font-size: 0.875rem;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition: color 0.3s;
|
transition: color 0.2s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-links a:hover {
|
.footer-links a:hover {
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.footer-social a {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
border-radius: 6px;
|
||||||
|
color: rgba(255, 255, 255, 0.6);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
transition:
|
||||||
|
color 0.2s,
|
||||||
|
border-color 0.2s,
|
||||||
|
background-color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-social a:hover {
|
||||||
|
color: white;
|
||||||
|
border-color: rgba(255, 255, 255, 0.5);
|
||||||
|
background-color: rgba(255, 255, 255, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-bottom {
|
||||||
|
border-top: 1px solid rgba(255, 255, 255, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-bottom-text {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: rgba(255, 255, 255, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-git-link {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: rgba(255, 255, 255, 0.4);
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-git-link:hover {
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
#download-house {
|
#download-house {
|
||||||
animation: floatinghouse 6s linear infinite;
|
animation: floatinghouse 6s linear infinite;
|
||||||
}
|
}
|
||||||
@keyframes floatinghouse {
|
@keyframes floatinghouse {
|
||||||
0% { top: 0; left: 0; }
|
0% {
|
||||||
10% { top: -2px; }
|
top: 0;
|
||||||
20% { top: -4px; }
|
left: 0;
|
||||||
30% { top: -6px; }
|
}
|
||||||
40% { top: -2px; }
|
10% {
|
||||||
50% { top: 0px; }
|
top: -2px;
|
||||||
60% { top: 4px; }
|
}
|
||||||
70% { top: 6px; }
|
20% {
|
||||||
80% { top: 8px; }
|
top: -4px;
|
||||||
90% { top: 4px; }
|
}
|
||||||
100% { top: 0; }
|
30% {
|
||||||
|
top: -6px;
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
top: -2px;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
top: 0px;
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
top: 4px;
|
||||||
|
}
|
||||||
|
70% {
|
||||||
|
top: 6px;
|
||||||
|
}
|
||||||
|
80% {
|
||||||
|
top: 8px;
|
||||||
|
}
|
||||||
|
90% {
|
||||||
|
top: 4px;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Trust strip ── */
|
||||||
|
.trust {
|
||||||
|
padding: 20px 0;
|
||||||
|
border-top: 1px solid var(--bs-border-color);
|
||||||
|
border-bottom: 1px solid var(--bs-border-color);
|
||||||
|
background: var(--hd-bg-canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-grid {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 24px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-tag {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--hd-accent);
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-tag .dot {
|
||||||
|
display: inline-block;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: var(--hd-accent);
|
||||||
|
animation: pulse-dot 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse-dot {
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
opacity: 0.5;
|
||||||
|
transform: scale(0.75);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-list {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-list span {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 4px 12px;
|
||||||
|
border-radius: 20px;
|
||||||
|
border: 1px solid color-mix(in srgb, currentColor 20%, transparent);
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
background: transparent;
|
||||||
|
transition:
|
||||||
|
border-color 0.2s,
|
||||||
|
color 0.2s,
|
||||||
|
background 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-list span:hover {
|
||||||
|
border-color: var(--hd-accent);
|
||||||
|
color: var(--hd-accent);
|
||||||
|
background: color-mix(in srgb, var(--hd-accent) 8%, transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-list span i {
|
||||||
|
font-size: 0.9em;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-more {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--hd-accent);
|
||||||
|
white-space: nowrap;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: opacity 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trust-more:hover {
|
||||||
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
|
|
@ -268,6 +423,243 @@ footer {
|
||||||
width: 50% !important;
|
width: 50% !important;
|
||||||
}
|
}
|
||||||
#community > div > div:first-child {
|
#community > div > div:first-child {
|
||||||
border-right: 1px solid #9332bb;
|
border-right: 1px solid var(--hd-plum-400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Big idea section ── */
|
||||||
|
.section {
|
||||||
|
padding: 96px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section--paper {
|
||||||
|
background: var(--hd-bg-subtle);
|
||||||
|
border-top: 1px solid var(--hd-border-1);
|
||||||
|
border-bottom: 1px solid var(--hd-border-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-head {
|
||||||
|
margin-bottom: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-head .eyebrow {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 0.6875rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow .dot {
|
||||||
|
display: inline-block;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: var(--hd-accent);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.h2 {
|
||||||
|
font-size: clamp(1.5rem, 4vw, 2.25rem);
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.15;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-head .h2 {
|
||||||
|
max-width: 720px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lede {
|
||||||
|
font-size: 1.0625rem;
|
||||||
|
line-height: 1.65;
|
||||||
|
color: var(--hd-fg-2);
|
||||||
|
margin-top: 14px;
|
||||||
|
max-width: 640px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 0;
|
||||||
|
border: 1px solid var(--hd-border-1);
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--hd-bg-canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-col {
|
||||||
|
padding: 28px 28px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-col + .idea-col {
|
||||||
|
border-left: 1px solid var(--hd-border-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-tag {
|
||||||
|
font-family: var(--hd-font-mono, monospace);
|
||||||
|
font-size: 10px;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--hd-fg-4);
|
||||||
|
margin-bottom: 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-tag .num {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: var(--hd-bg-subtle);
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
font-size: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-col h3 {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
letter-spacing: -0.015em;
|
||||||
|
margin: 0 0 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.idea-col h3 .strike {
|
||||||
|
text-decoration: line-through;
|
||||||
|
color: var(--hd-fg-4);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zone-pre {
|
||||||
|
font-family: var(--hd-font-mono, monospace);
|
||||||
|
font-size: 11.5px;
|
||||||
|
line-height: 1.7;
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
background: var(--hd-bg-subtle);
|
||||||
|
border: 1px solid var(--hd-border-1);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 14px 16px;
|
||||||
|
margin: 0;
|
||||||
|
white-space: pre;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zone-pre .k {
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
.zone-pre .v {
|
||||||
|
color: var(--hd-fg-2);
|
||||||
|
}
|
||||||
|
.zone-pre .c {
|
||||||
|
color: var(--hd-fg-4);
|
||||||
|
}
|
||||||
|
.zone-pre .a {
|
||||||
|
color: var(--hd-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc {
|
||||||
|
border: 1px solid var(--hd-border-1);
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
background: var(--hd-bg-canvas);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 9px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-row + .svc-row {
|
||||||
|
border-top: 1px solid var(--hd-bg-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-l {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-ico {
|
||||||
|
width: 26px;
|
||||||
|
height: 26px;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: var(--hd-accent-subtle);
|
||||||
|
border: 1px solid var(--hd-accent-border);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: var(--hd-accent);
|
||||||
|
font-size: 13px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-bs-theme="dark"] .svc-ico {
|
||||||
|
background: var(--hd-accent-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-name {
|
||||||
|
font-size: 12.5px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--hd-fg-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-desc {
|
||||||
|
font-size: 10.5px;
|
||||||
|
color: var(--hd-fg-3);
|
||||||
|
margin-top: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-r {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-cnt {
|
||||||
|
font-family: var(--hd-font-mono, monospace);
|
||||||
|
font-size: 10px;
|
||||||
|
color: var(--hd-fg-4);
|
||||||
|
background: var(--hd-bg-subtle);
|
||||||
|
padding: 2px 6px;
|
||||||
|
border-radius: 9999px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.svc-ok {
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--hd-accent);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.idea-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
.idea-col + .idea-col {
|
||||||
|
border-left: none;
|
||||||
|
border-top: 1px solid var(--hd-border-1);
|
||||||
|
}
|
||||||
|
.section {
|
||||||
|
padding: 64px 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
7
static/js/bootstrap.min.js
vendored
7
static/js/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
2
static/js/jquery.slim.min.js
vendored
2
static/js/jquery.slim.min.js
vendored
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue