diff --git a/.gitignore b/.gitignore index 132a090..d0d6966 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ public/ -resources/ \ No newline at end of file +resources/ +node_modules/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d68917a..4d7953b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ # # All available Hugo versions are listed under https://gitlab.com/pages/hugo/container_registry. # -image: hugomods/hugo:base +image: hugomods/hugo:exts-non-root stages: - build @@ -9,7 +9,10 @@ stages: pages: stage: build script: + - npm ci - hugo artifacts: paths: - public + rules: + - if: $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "main" diff --git a/.woodpecker.yaml b/.woodpecker.yaml index 7bc94f9..0c13448 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -6,8 +6,9 @@ when: steps: - name: build - image: hugomods/hugo:base + image: hugomods/hugo:exts commands: + - npm ci - hugo environment: HUGO_ENVIRONMENT: production @@ -21,7 +22,7 @@ steps: ftp_password: from_secret: ovh_ftp_password clean_dir: true - pre_action: 'set ftp:passive-mode true' + pre_action: "set ftp:passive-mode true" secure: false src_dir: /public/ dest_dir: /www/ diff --git a/assets/scss/bootstrap.scss b/assets/scss/bootstrap.scss new file mode 100644 index 0000000..771ce6b --- /dev/null +++ b/assets/scss/bootstrap.scss @@ -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); +} diff --git a/config.yml b/config.yml index 01d22d6..517b2cf 100644 --- a/config.yml +++ b/config.yml @@ -34,14 +34,12 @@ languages: DefaultDescription: "L'interface qui vous rend heureux de gérer vos noms de domaines." others_links: - - text: "S'inscrire" - href: "//app.happydomain.org/register" - class: "btn btn-secondary" - icon: "bi-person-plus-fill" - text: "S'identifier" - href: "//app.happydomain.org/login" - class: "btn btn-outline-primary" - icon: "bi-person-check-fill" + href: "/fr/beta/" + class: "btn btn-link text-dark" + - text: "Essayer en ligne →" + href: "//try.happydomain.org/" + class: "btn btn-primary btn-sm" carousel: - title: "domains-lists" @@ -73,12 +71,12 @@ languages: image: "/img/screenshots/domain-logs.webp" - title: "domain-abstract-list" - description: "Une zone simplifiée, sous forme de liste, plus rapide à modifier" - image: "/img/screenshots/domain-abstract-list.webp" + description: "Les enregistrements bruts de la zone" + image: "/img/screenshots/domain-abstract-records.webp" - title: "sources" - description: "Liste des hébergeurs existantes où récupérer les domaines" - image: "/img/screenshots/sources.png" + description: "Liste des hébergeurs existants où récupérer les domaines" + image: "/img/screenshots/providers-list.webp" params: author: @@ -89,15 +87,35 @@ params: survey: "https://feedback.happydomain.org/" tryit: "https://try.happydomain.org/" + # Screenshots cycled in the hero browser mockup (jumbo partial). + jumboscreen: + - image: "/img/screenshots/domains-list.webp" + path: "/domains" + alt: "List of your domains in happyDomain" + weight: 10 + + - image: "/img/screenshots/checks-dashboard.webp" + path: "/domains/happydomain.org" + alt: "Each domain has extensive checks" + weight: 20 + + - image: "/img/screenshots/domain-abstract.webp" + path: "/domains/happydomain.org/editor" + alt: "A zone organized by service" + weight: 30 + + - image: "/img/screenshots/zone-diff.webp" + path: "/zone/happydomain.org/records" + alt: "Reviewing changes before applying them" + weight: 40 + others_links: - - text: "Sign up" - href: "//app.happydomain.org/register" - class: "btn btn-secondary" - icon: "bi-person-plus-fill" - text: "Sign in" - href: "//app.happydomain.org/login" - class: "btn btn-outline-primary" - icon: "bi-person-check-fill" + href: "/en/beta/" + class: "btn btn-link text-dark" + - text: "Try it online →" + href: "//try.happydomain.org/" + class: "btn btn-primary btn-sm" carousel: - title: "domains-lists" @@ -129,12 +147,12 @@ params: image: "/img/screenshots/domain-logs.webp" - title: "domain-abstract-list" - description: "Simplified zone in list, for quicker editing" - image: "/img/screenshots/domain-abstract-list.webp" + description: "Raw records of the zone" + image: "/img/screenshots/domain-abstract-records.webp" - title: "sources" description: "Existing name service providers where pull domains" - image: "/img/screenshots/sources.png" + image: "/img/screenshots/providers-list.webp" menu: main: @@ -153,6 +171,31 @@ menu: url: "https://blog.happydomain.org/" 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: goldmark: renderer: diff --git a/content/beta.en.md b/content/beta.en.md new file mode 100644 index 0000000..e9136a7 --- /dev/null +++ b/content/beta.en.md @@ -0,0 +1,54 @@ ++++ +title = "Join the beta" +description = "Public registrations on app.happydomain.org are closed. Join the beta program or self-host happyDomain to get started." ++++ + +## Online version closed + +Public registrations on `app.happydomain.org` are paused while we +polish the next release. + +### happyDomain is evolving + +happyDomain will soon let you **continuously test the security of +your domains** and **monitor every service exposed through DNS** +(web, mail, VPN, etc.) — all of this **with zero configuration**, +working straight from your existing records. + +We are rolling out this new version **progressively**, to gather +feedback from our users and refine the service before reopening it +to everyone. Your input at this stage is invaluable in helping us +deliver the best possible product. + +Two ways to use happyDomain right now: + +### 1. Join the beta program + +Subscribe below and we will send you an invitation once a spot opens up. + +
+ + + +
+ + +
+ + +
+ +### 2. Self-host happyDomain + +happyDomain is open source. You can run it on your own machine in minutes: + +- **Binary:** download a [release for your platform](/#downloads). +- **Docker:** `docker run -p 8081:8081 happydomain/happydomain`. + +Source code and documentation live on [git.happydomain.org](https://git.happydomain.org/). diff --git a/content/beta.fr.md b/content/beta.fr.md new file mode 100644 index 0000000..d99a581 --- /dev/null +++ b/content/beta.fr.md @@ -0,0 +1,55 @@ ++++ +title = "Rejoindre la bêta" +description = "Les inscriptions publiques sur app.happydomain.org sont fermées. Rejoignez le programme bêta ou auto-hébergez happyDomain pour commencer." ++++ + +## Version en ligne fermée + +Les inscriptions publiques sur `app.happydomain.org` sont suspendues +le temps de finaliser la prochaine version. + +### happyDomain se transforme + +happyDomain va bientôt vous permettre de **tester en continu la +sécurité de vos domaines** et de **superviser l'ensemble des services +exposés via le DNS** (web, mail, VPN, etc.) — le tout **sans +configuration**, en s'appuyant directement sur vos enregistrements. + +Nous déployons cette nouvelle version **progressivement**, afin de +recueillir les avis de nos utilisateurs et d'ajuster le service avant +sa réouverture publique. Votre retour à ce stade est précieux pour +nous aider à offrir le meilleur produit possible. + +Deux manières d'utiliser happyDomain dès maintenant : + +### 1. Rejoindre le programme bêta + +Inscrivez-vous ci-dessous, nous vous enverrons une invitation +dès qu'une place se libère. + +
+ + + +
+ + +
+ + +
+ +### 2. Auto-héberger happyDomain + +happyDomain est libre. Vous pouvez le faire tourner sur votre propre machine en quelques minutes : + +- **Binaire :** téléchargez une [version pour votre plateforme](/fr/#downloads). +- **Docker :** `docker run -p 8081:8081 happydomain/happydomain`. + +Le code source et la documentation sont sur [git.happydomain.org](https://git.happydomain.org/). diff --git a/content/legal-notice.en.md b/content/legal-notice.en.md index cba0ef9..e2345a7 100644 --- a/content/legal-notice.en.md +++ b/content/legal-notice.en.md @@ -16,8 +16,8 @@ De facto association "happyDNS"
Association happyDNS
ABS Pierre-Olivier Mercier
-40 avenue Raspail
-94250 GENTILLY +8 avenue Georges Clemenceau
+14000 CAEN
diff --git a/content/legal-notice.fr.md b/content/legal-notice.fr.md index 01e72b8..247fe1a 100644 --- a/content/legal-notice.fr.md +++ b/content/legal-notice.fr.md @@ -18,8 +18,8 @@ Siège social :
Association happyDNS
ABS Pierre-Olivier Mercier
-40 avenue Raspail
-94250 GENTILLY +8 avenue Georges Clemenceau
+14000 CAEN
### Hébergement diff --git a/content/newsletter.en.html b/content/newsletter.en.html index 2363ae1..c7418d1 100644 --- a/content/newsletter.en.html +++ b/content/newsletter.en.html @@ -6,7 +6,7 @@ title = "Subscribe to our newsletter" Join the happyDomain newsletter -
+
@@ -25,7 +25,7 @@ title = "Subscribe to our newsletter" -
+ diff --git a/content/newsletter.fr.html b/content/newsletter.fr.html index a782687..3b7e483 100644 --- a/content/newsletter.fr.html +++ b/content/newsletter.fr.html @@ -6,7 +6,7 @@ title = "Rejoindre notre newsletter" S'inscrire à la lettre d'information d'happyDomain -
+
@@ -25,7 +25,7 @@ title = "Rejoindre notre newsletter" -
+ diff --git a/content/use-happyDomain/cio.en.html b/content/use-happyDomain/cio.en.html index 4077b21..7cecd3b 100644 --- a/content/use-happyDomain/cio.en.html +++ b/content/use-happyDomain/cio.en.html @@ -19,12 +19,12 @@ layout = "usage"
-

+

Keep track of every change with the built-in history.


- happyDomain allows you to go back at any time in case of a problem. + happyDomain allows you to go back at any time in case of a problem.

The history allows you to easily track the latest changes, keeping track of who made them. @@ -37,14 +37,14 @@ layout = "usage"

-
+
Liste des domaines, regroupés astucieusement par client
-

+

Share the management of zones between your teams. (coming soon) @@ -55,7 +55,7 @@ layout = "usage" Reduce friction between your teams by allowing them to manage records related to their projects (internal or even public).

- happyDomain implements a powerful access control system allowing you to delegate all or part of a zone, up to the recording. + happyDomain implements a powerful access control system allowing you to delegate all or part of a zone, up to the recording.

@@ -66,12 +66,12 @@ layout = "usage"
-

+

Centralize and synchronize your domain portfolios.


- happyDomain connects to more than 25 hosting providers worldwide. You can manage them in the interface with one click. + happyDomain connects to more than 25 hosting providers worldwide. You can manage them in the interface with one click.

@@ -81,14 +81,14 @@ layout = "usage"
-
+
Relisiez puis confirmer les modifications qui seront appliquées
-

+

Keep track of the purpose of each sub-domain. (coming soon) @@ -96,7 +96,7 @@ layout = "usage"


- happyDomain allows you to set an expiration date on your subdomains so that a temporary event and its servers do not remain accessible, simply because a closing ticket has not been processed. We take care of it automatically. + happyDomain allows you to set an expiration date on your subdomains so that a temporary event and its servers do not remain accessible, simply because a closing ticket has not been processed. We take care of it automatically.

diff --git a/content/use-happyDomain/cio.fr.html b/content/use-happyDomain/cio.fr.html index 86afb61..21d43a1 100644 --- a/content/use-happyDomain/cio.fr.html +++ b/content/use-happyDomain/cio.fr.html @@ -19,12 +19,12 @@ layout = "usage"
-

+

Garder une trace de chaque modification avec l'historique intégré.


- happyDomain vous permet de revenir en arrière à n'importe quel moment en cas de problème. + happyDomain vous permet de revenir en arrière à n'importe quel moment en cas de problème.

L'historique vous permet de vous repérer facilement dans les dernières modifications, en gardant une trace des intervenants. @@ -37,14 +37,14 @@ layout = "usage"

-
+
Liste des domaines, regroupés astucieusement par client
-

+

Partagez la gestion des zones entre vos équipes. (bientôt disponible) @@ -55,7 +55,7 @@ layout = "usage" Réduisez les points de frictions entre vos équipes en leur permettant de gérer les enregistrements relatifs à leurs projets (internes ou publics).

- happyDomain met en place un puissant système de contrôle d'accès permettant de déléguer tout ou partie d'une zone, jusqu'à l'enregistrement. + happyDomain met en place un puissant système de contrôle d'accès permettant de déléguer tout ou partie d'une zone, jusqu'à l'enregistrement.

@@ -66,12 +66,12 @@ layout = "usage"
-

+

Centraliser et synchroniser vos portefeuilles de domaines.


- happyDomain se connecte à plus de 25 hébergeurs à travers le monde. Vous pouvez les gérer dans l'interface en un clic. + happyDomain se connecte à plus de 25 hébergeurs à travers le monde. Vous pouvez les gérer dans l'interface en un clic.

@@ -81,14 +81,14 @@ layout = "usage"
-
+
Relisiez puis confirmer les modifications qui seront appliquées
-

+

Garder une trace de la raison d'être de chaque sous-domaine. (bientôt disponible) @@ -96,7 +96,7 @@ layout = "usage"


- happyDomain vous permet de fixer une date d'expiration sur vos sous-domaines pour éviter qu'un événement temporaire et ses serveurs restent accessibles simplement parce qu'un ticket de fermeture n'a pas été traité. On s'en occupe automatiquement. + happyDomain vous permet de fixer une date d'expiration sur vos sous-domaines pour éviter qu'un événement temporaire et ses serveurs restent accessibles simplement parce qu'un ticket de fermeture n'a pas été traité. On s'en occupe automatiquement.

diff --git a/content/use-happyDomain/devops.en.html b/content/use-happyDomain/devops.en.html index dc9728f..431a7e2 100644 --- a/content/use-happyDomain/devops.en.html +++ b/content/use-happyDomain/devops.en.html @@ -18,13 +18,13 @@ layout = "usage"
-

+

All your domains' operations
accessible via a REST API.


- Everything that's done in the happyDomain web interface can easily be done with the API, in your language of choice. + Everything that's done in the happyDomain web interface can easily be done with the API, in your language of choice.

Our REST API is fully documented, and thanks to Swagger, you can browse it and easily generate a tool using it in any supported language. @@ -40,20 +40,20 @@ layout = "usage"

-
+
Liste des domaines, regroupés astucieusement par client
-

+

Forget about the complexity of each hosting company.
Take advantage of our unified interface.


- Don't be afraid of discovering a new host. happyDomain manages over 25 hosts worldwide: + Don't be afraid of discovering a new host. happyDomain manages over 25 hosts worldwide:

  • cloud services : Route53, Azure DNS, Google Cloud DNS, DigitalOcean, Linode, Oracle Cloud, ...
  • @@ -73,13 +73,13 @@ layout = "usage"
    -

    +

    Respond to all requests
    with ease.


    - A new service? An urgent fix? happyDomain uses simple terminology to stay focused. + A new service? An urgent fix? happyDomain uses simple terminology to stay focused.

    @@ -89,14 +89,14 @@ layout = "usage"
    -
    +
    Python SDK usage
    -

    +

    Many tools are already available for you, DevOps.


    @@ -107,8 +107,8 @@ layout = "usage" add or modify zone records, manage new domains through their registrar, - manage happyDomain's users, - or deploy happyDomain using the official Ansible collection. + manage happyDomain's users, + or deploy happyDomain using the official Ansible collection.
  • diff --git a/content/use-happyDomain/devops.fr.html b/content/use-happyDomain/devops.fr.html index 2ae1860..37cab26 100644 --- a/content/use-happyDomain/devops.fr.html +++ b/content/use-happyDomain/devops.fr.html @@ -18,13 +18,13 @@ layout = "usage"
    -

    +

    Tous vos domaines
    accessibles par une API REST.


    - Tout ce qui se fait dans l'interface web d'happyDomain peut se faire facilement avec l'API, dans votre langage de prédilection. + Tout ce qui se fait dans l'interface web d'happyDomain peut se faire facilement avec l'API, dans votre langage de prédilection.

    Notre API REST est entièrement documentée et grâce à Swagger, vous pouvez la parcourir et générer aisément un outil l'utilisant dans tous les langages supportés. @@ -40,20 +40,20 @@ layout = "usage"

    -
    +
    Liste des domaines, regroupés astucieusement par client
    -

    +

    Oubliez la complexité de chaque hébergeur.
    Profitez de notre interface unifiée.


    - N'ayez plus d'appréhension à découvrir un nouvel hébergeur. happyDomain gère plus de 25 hébergeurs à travers le monde : + N'ayez plus d'appréhension à découvrir un nouvel hébergeur. happyDomain gère plus de 25 hébergeurs à travers le monde :

    -
    +
    + -
    diff --git a/layouts/partials/scripts.html b/layouts/partials/scripts.html index 1dcf66c..730f2cf 100644 --- a/layouts/partials/scripts.html +++ b/layouts/partials/scripts.html @@ -1,7 +1,9 @@ - - - + +