From 3508bd3ef4511abc559a4eff6fe5012c472e9e96 Mon Sep 17 00:00:00 2001 From: yuluo-yx Date: Tue, 9 Apr 2024 11:41:32 +0800 Subject: [PATCH] feat: use k8s.website.tabs to show different installation types Signed-off-by: yuluo-yx --- go.mod | 2 +- site/assets/scss/_base.scss | 920 ++++++++++++++++++++ site/assets/scss/_reset.scss | 49 ++ site/assets/scss/_size.scss | 28 + site/assets/scss/_skin.scss | 5 + site/assets/scss/_variables_project.scss | 6 + site/content/en/v1.0.0/user/quickstart.md | 20 +- site/layouts/shortcodes/common/_common.html | 16 + site/layouts/shortcodes/tab.html | 19 + site/layouts/shortcodes/tabs.html | 50 ++ site/static/img/texture.png | Bin 0 -> 35987 bytes 11 files changed, 1111 insertions(+), 4 deletions(-) create mode 100644 site/assets/scss/_base.scss create mode 100644 site/assets/scss/_reset.scss create mode 100644 site/assets/scss/_size.scss create mode 100644 site/assets/scss/_skin.scss create mode 100644 site/layouts/shortcodes/common/_common.html create mode 100644 site/layouts/shortcodes/tab.html create mode 100644 site/layouts/shortcodes/tabs.html create mode 100644 site/static/img/texture.png diff --git a/go.mod b/go.mod index f6309d67f41..68f17b06032 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/envoyproxy/gateway -go 1.22 +go 1.21 require ( fortio.org/fortio v1.63.5 diff --git a/site/assets/scss/_base.scss b/site/assets/scss/_base.scss new file mode 100644 index 00000000000..4d3f3ee974d --- /dev/null +++ b/site/assets/scss/_base.scss @@ -0,0 +1,920 @@ +@import "reset"; + +// header +$full-width-paddingX: 20px; + +$main-width: 100%; +$main-max-width: 100%; + +$header-height: 80px; + +$logo-width: 180px; + +$nav-buttons-margin-left: 30px; + +$hamburger-size: 50px; + +// main nav +$main-nav-padding: 140px 0 30px; +$main-nav-h5-margin-bottom: 1em; +$main-nav-h3-margin-bottom: 0.6em; +$nav-box-width: 20%; +$nav-box-sibling-margin-left: calc(20% / 3); +$main-nav-main-sibling-margin-top: 60px; +$main-nav-left-button-size: 50px; +$main-nav-left-button-font-size: 18px; + +// hero +$hero-padding-top: 80px; +$headline-wrapper-margin-bottom: 40px; +$quickstart-button-padding: 0 50px; +$vendor-strip-height: 88px; +$vendor-strip-font-size: 16px; + +// video +$video-section-height: 200px; + +@import "size"; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +body { + background-color: white; + + a { + color: $blue; + } +} + +section { + position: relative; + background-color: white; +} + +section, +header, +footer { + .main-section { + position: relative; + margin: auto; + } + + p { + font-size: 14px; + font-weight: 400; + } + + .button { + display: inline-block; + border-radius: 6px; + padding: 6px 20px; + line-height: 1.3rem; + color: white; + background-color: $blue; + text-decoration: none; + font-size: 1rem; + border: 0px; + + } + + .button:hover { + background-color: darken($blue, 10%); + } + + #cellophane { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: none; + } +} + +main { + .button { + display: inline-block; + border-radius: 6px; + padding: 6px 20px; + line-height: 1.3rem; + color: white; + background-color: $blue; + text-decoration: none; + font-size: 1rem; + border: 0px; + } +} + +::selection { + background: #326ce5; + color: white; +} + +::-moz-selection { + background: #326ce5; + color: white; +} + +// HEADER + +#hamburger { + display: inline-block; + position: relative; + margin-left: auto; + vertical-align: middle; + padding: 0; + border: 0; + background: none; + + div, + &:before, + &:after { + position: absolute; + left: 15%; + width: 70%; + height: 2px; + background-color: $blue; + transition: 0.3s; + content: ""; + } + + div { + top: calc(50% - 1px); + } + + &:before { + top: 24%; + } + + &:after { + bottom: 24%; + } + + &:hover { + div, + &:before, + &:after { + background-color: white; + } + } +} + +// HERO +.header-hero { + background-image: url(/img/texture.png); + background-color: $dark-grey; + text-align: center; + padding-left: 0; + padding-right: 0; + margin-bottom: 0; + position: relative; + + &.bot-bar:after { + display: block; + margin-bottom: -24px; + height: 8px; + width: 100%; + background-color: transparentize(white, 0.9); + content: ""; + } + + &.no-sub { + h5 { + display: none; + } + + h1 { + margin-bottom: 20px; + } + } +} + +.td-home .header-hero:after { + display: none; +} + +.header-hero { + background-color: $dark-grey; + + h5 { + margin: 20px 0; + line-height: 28px; + } +} + +#vendorStrip { + position: relative; + + ul { + float: left; + } + + li { + display: inline-block; + height: 100%; + } + + a { + display: block; + height: 100%; + color: white; + font-size: 0.75em; + font-weight: bold; + } + + li + li { + margin-left: 0; + } +} + +.pi-accordion { + & > .container:first-child > .item:first-child > .title:first-child { + padding-left: 0; + font-size: 1.5em; + font-weight: 700; + } + + & > .container:first-child > .item.yah:first-child > .title:first-child { + margin-left: -20px !important; + } + + .item { + overflow: hidden; + } + + .title { + color: $dark-grey; + position: relative; + padding: 7.5px 10px 7.5px 18px; + cursor: pointer; + transition: 0.3s; + + &:hover { + color: $blue; + } + } + + a.item > .title { + color: black; + + &:hover { + color: $blue; + } + } + + div.item > .title { + &:before { + content: ""; + position: absolute; + top: 12px; + left: 2px; + border-style: solid; + border-width: 5px 0 5px 8px; + border-color: transparent transparent transparent $blue; + transform: rotate(0deg); + transition: 0.3s; + } + } + + .wrapper { + position: relative; + width: 100%; + transition: height 0.3s; + } + + .content { + padding-left: 20px; + opacity: 0; + transition: 0.3s; + } + + .item.on { + & > .title:before { + transform: rotate(90deg); + } + + & > .wrapper > .content { + opacity: 1; + } + } +} + +dt { + margin-bottom: 8px; +} + +dd { + margin-bottom: 16px; +} + +.pi-pushmenu { + display: none; + position: fixed; + top: 0; + width: 100%; + height: 100%; + opacity: 0; + transition: opacity 0.3s; + + &.on { + opacity: 1; + } + + .overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.4); + } + + .sled { + position: absolute; + top: 0; + width: 0; + height: 100%; + background-color: white; + overflow: auto; + transition: 0.3s; + } + + &.on .sled { + width: 400px; + max-width: 100vw; + } + + .top-bar { + height: 0; + line-height: 60px; + background-color: #444; + } + + ul { + margin-top: 25px; + } + + li { + position: relative; + display: block; + width: 100%; + min-height: 45px; + padding: 0 60px 0 20px; + border-bottom: 1px solid #cccccc; + } + + a { + display: inline-block; + width: 100%; + height: 45px; + line-height: 45px; + font-size: 20px; + color: $blue; + } + + .button { + background: none; + padding: 0; + } + + ul ul { + padding: 0 20px; + + li { + min-height: 40px; + } + + a { + height: 40px; + line-height: 40px; + font-size: 18px; + color: lighten(#222222, 20%); + } + } +} + +.push-menu-close-button { + position: absolute; + top: 0; + right: 0; + width: 50px; + height: 50px; + + &:before, + &:after { + content: ""; + position: absolute; + top: calc(50% - 1px); + left: 25%; + width: 50%; + height: 2px; + background-color: black; + } + + &:before { + transform: rotate(45deg); + } + + &:after { + transform: rotate(-45deg); + } +} + +// ocean nodes +$ocean-nodes-padding-Y: 60px; +$ocean-nodes-main-margin-bottom: 60px; +$ocean-nodes-h3-margin-bottom: 30px; + +// video +$video-section-height: 200px; + +// features +$features-h3-margin-bottom: 20px; +$feature-box-div-width: 100%; +$feature-box-margin-bottom: 0; +$feature-box-div-margin-bottom: 40px; + +// Home-specific + +.td-home { + &.flip-nav, + &.open-nav { + .logo { + background-image: url(/images/nav_logo2.svg); + } + } +} + +.header-hero { + margin-bottom: 0; + padding-bottom: 1px; + + .main-section { + padding: 0 10px; + margin-bottom: 30px; + } + + #vendorStrip { + display: none; + } +} + +// Add logo to CNCF section +section#cncf { + padding-top: 60px; + padding-bottom: 140px; + background-image: url(/images/cncf-color.svg); + background-position: center 100px; + background-repeat: no-repeat; + background-size: 300px; +} + +// OCEAN NODES +#oceanNodes { + padding-top: $ocean-nodes-padding-Y; + padding-bottom: $ocean-nodes-padding-Y; + + a { + color: $blue; + } + + .main-section { + margin-bottom: $ocean-nodes-padding-Y; + min-height: 160px; + } + + .image-wrapper { + max-width: 75%; + margin: 0 auto 20px; + text-align: center; + + img { + width: 100%; + max-width: 160px; + } + } + + .main-section:first-child { + .image-wrapper { + max-width: 100%; + + img { + max-width: 491px; + } + } + } + + h3 { + margin-bottom: $ocean-nodes-h3-margin-bottom; + } +} + +// Video thingy +#video { + height: $video-section-height; +} + +#video { + width: 100%; + position: relative; + background-position: center center; + background-size: cover; + + & > .light-text { + display: none; + // position: absolute; + // top: 50%; + // left: 75%; + width: 500px; + padding-top: 2rem; + // transform: translate(-50%, -50%); + color: white; + } + + h2 { + font-size: 32px; + line-height: 44px; + margin-bottom: 20px; + } + + p { + margin-bottom: 20px; + } + + #desktopKCButton { + position: absolute; + font-size: 18px; + background-color: $dark-grey; + border-radius: 8px; + color: $white; + padding: 20px 10px 20px 10px; + } + + #desktopKCButton:hover{ + background-color: #ffffff; + color: #3371e3; + transition: 150ms; + } + + #desktopShowVideoButton { + position: relative; + font-size: 24px; + background-color: white; + border-radius: 8px; + color: $blue; + padding: 15px 30px 15px 80px; + margin-bottom: 15px; + + &:before { + content: ""; + position: absolute; + @include pureCenter(40px); + width: 0; + height: 0; + border-style: solid; + border-width: 10px 0 10px 20px; + border-color: transparent transparent transparent $blue; + } + + &:hover::before { + border-color: transparent transparent transparent $dark-grey; + } + } + + #desktopShowVideoButton:hover{ + color: $dark-grey; + transition: 150ms; + } + + #mobileShowVideoButton { + @include pureCenter; + width: 80px; + height: 80px; + border-radius: 50%; + background-color: transparent; + border: 5px solid rgba(255, 255, 255, 0.2); + overflow: visible; + + &:after { + @include pureCenter; + left: 40px; + content: ""; + width: 0; + height: 0; + border-style: solid; + border-width: 20px 0 20px 30px; + border-color: transparent transparent transparent #ffffff; + } + } +} + +#videoPlayer { + @include fullScreen; + background-color: rgba(0, 0, 0, 0.9); + display: none; + + iframe { + @include pureCenter; + @include maintain-aspect-ratio; + } + + #closeButton { + position: absolute; + top: 20px; + right: 20px; + width: 50px; + height: 50px; + border: 2px solid transparent; + transition: 0.3s; + + &:before, + &:after { + content: ""; + position: absolute; + top: calc(50% - 1px); + left: 10%; + width: 80%; + height: 2px; + background-color: white; + } + + &:before { + transform: rotate(45deg); + } + + &:after { + transform: rotate(-45deg); + } + + &:hover { + border-color: white; + } + } +} + +// KubeWeekly +#kubeweekly { + background-color: $light-grey; + padding-top: 30px; + padding-bottom: 80px; + background-size: auto; + font-size: 24px; + // font-weight: bold; + + h5 { + font-size: 20px; + } +} + +.subscribe-button { + border-radius: 6px; + padding: 0 20px; + line-height: 31px; + color: white; + background-color: blue; + text-decoration: none; + font-size: 14px; +} + +// Features +#features { + padding-top: 140px; + background-color: $light-grey; + background-image: url(/images/wheel.svg); + background-position: center 60px; + background-repeat: no-repeat; + background-size: 60px; +} + +.feature-box { + //padding: 50px 0 + width: 100%; + overflow: hidden; + clear: both; + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + + h4 { + line-height: normal; + margin-bottom: 15px; + } + + & > div { + background-color: #daeaf9; + border-radius: 20px; + padding: 25px; + } +} + +#features { + h3 { + margin-bottom: $features-h3-margin-bottom; + } + + .feature-box { + margin-bottom: $feature-box-margin-bottom; + + & > div { + width: $feature-box-div-width; + margin-bottom: $feature-box-div-margin-bottom; + } + } +} + +// Talk to us +#talkToUs { + h3, + h4 { + text-align: center; + } + + h3 { + margin-bottom: 15px; + } + + h4 { + line-height: normal; + margin-bottom: 50px; + + br { + display: none; + } + } + + #bigSocial { + overflow: hidden; + + div { + width: 100%; + float: left; + padding: 30px; + padding-top: 110px; + background-position: center top; + background-size: auto; + background-repeat: no-repeat; + } + + div:nth-child(1) { + background-image: url(/images/twitter_icon.png); + } + + div:nth-child(2) { + background-image: url(/images/github_icon.png); + } + + div:nth-child(3) { + background-image: url(/images/slack_icon.png); + } + + div:nth-child(4) { + background-image: url(/images/stackoverflow_icon.png); + } + + div + div { + margin-top: 20px; + margin-left: 0; + } + + a { + display: inline-block; + color: $blue; + font-size: 24px; + font-weight: 400; + text-decoration: none; + margin-bottom: 15px; + } + + a, + p { + text-align: center; + width: 100%; + } + } +} + +.td-home { + #talkToUs { + .main-section { + padding: 30px 0; + } + + h5 { + font-size: 20px; + } + } + + #caseStudiesWrapper { + position: relative; + text-align: center; + margin-bottom: 30px; + + img { + padding-bottom: 1rem; + } + + div { + position: relative; + display: inline-block; + vertical-align: top; + width: 100%; + min-height: 230px; + margin-bottom: 60px; + padding-right: 1rem; + background-position: top center; + } + + p { + font-size: 20px; + } + + a { + position: absolute; + bottom: -30px; + left: 50%; + transform: translateX(-50%); + color: $blue; + font-weight: 400; + } + } +} + +// Header filler size adjustment + +.header-hero.filler { + height: $hero-padding-top; +} + +// Docs specific + +#editPageButton { + position: absolute; + top: 50px; + right: 25px; + width: 50px; + height: 50px; + line-height: 50px; + border-radius: 50%; + white-space: nowrap; + text-indent: 50px; + overflow: hidden; + background: $blue url(/images/icon-pencil.svg) no-repeat; + background-position: 12px 10px; + background-size: 29px 29px; +} + +.feedback--response__hidden { + display: none; +} + +// GitHub info/edit buttons +#pre-footer { + margin-top: 2rem; + + .button { + font-size: 1.1rem; + + &:first-of-type { + margin-right: 0.75rem; + } + } + + .lastedit { + margin-top: 1rem; + font-size: 1rem; + } +} + +/* DOCUMENTATION */ + +// nav-tabs and tab-content +.nav-tabs { + border-bottom: none !important; + + .nav-item { + margin-bottom: 0; + } +} + +.td-content .tab-content .highlight { + margin: 0; +} + +//Table Content +.tab-content table{ + border-collapse: separate; + border-spacing: 6px; +} + +.tab-pane { + border-radius: 0.25rem; + padding: 0 16px 16px; + overflow: auto; + + border: 1px solid #dee2e6; + &:first-of-type.active { + border-top-left-radius: 0; + } +} diff --git a/site/assets/scss/_reset.scss b/site/assets/scss/_reset.scss new file mode 100644 index 00000000000..1978abec5c9 --- /dev/null +++ b/site/assets/scss/_reset.scss @@ -0,0 +1,49 @@ +// CONVENIENCE +.clear { + display: block; + clear: both; + } + + .light-text { + color: white; + } + + .right { + float: right; + } + + .left { + float: left; + } + + .center { + text-align: center; + } + + //mixins + @mixin fullScreen { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + } + + @mixin pureCenter($left: 50%, $top: 50%) { + position: absolute; + top: $top; + left: $left; + transform: translate(-50%, -50%); + } + + @mixin maintain-aspect-ratio( + $width-factor: 16, + $height-factor: 9, + $target-width: 80vw, + $target-height: 80vh + ) { + width: $target-width; + height: $target-width * ($height-factor / $width-factor); + max-width: $target-height * ($width-factor / $height-factor); + max-height: $target-height; + } diff --git a/site/assets/scss/_size.scss b/site/assets/scss/_size.scss new file mode 100644 index 00000000000..14d56201c30 --- /dev/null +++ b/site/assets/scss/_size.scss @@ -0,0 +1,28 @@ +section, +#vendorStrip { + padding-left: $full-width-paddingX; + padding-right: $full-width-paddingX; +} + +#hamburger { + width: $hamburger-size; + height: $hamburger-size; +} + +.header-hero { + padding-top: $hero-padding-top; +} + +#vendorStrip { + height: $vendor-strip-height; + line-height: $vendor-strip-height; + font-size: $vendor-strip-font-size; +} + +#announcement { + min-height: $hero-padding-top; + + .announcement-main { + padding-top: calc(max(8em, 8rem, #{$hero-padding-top} / 3)); + } +} diff --git a/site/assets/scss/_skin.scss b/site/assets/scss/_skin.scss new file mode 100644 index 00000000000..32c94b9dc52 --- /dev/null +++ b/site/assets/scss/_skin.scss @@ -0,0 +1,5 @@ +$blue: #3371e3; +$light-grey: #f7f7f7; +$dark-grey: #303030; +$medium-grey: #4c4c4c; +$white: #ffffff; diff --git a/site/assets/scss/_variables_project.scss b/site/assets/scss/_variables_project.scss index 7e918d43018..38fac24150e 100644 --- a/site/assets/scss/_variables_project.scss +++ b/site/assets/scss/_variables_project.scss @@ -4,6 +4,12 @@ Add styles or override variables from the theme here. */ +@import "reset"; +@import "skin"; + +@import "base"; + + $primary: #280C53; $secondary: #802A78; $dark: #280C53; diff --git a/site/content/en/v1.0.0/user/quickstart.md b/site/content/en/v1.0.0/user/quickstart.md index db184923e50..21eae0859b2 100644 --- a/site/content/en/v1.0.0/user/quickstart.md +++ b/site/content/en/v1.0.0/user/quickstart.md @@ -47,10 +47,16 @@ consideration when debugging. ## Testing the Configuration +{{< tabs name="tabs_test_the_configuration" >}} +{{% tab name="Test Configuration" %}} + Get the name of the Envoy service created the by the example Gateway: ```shell -export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}') +export ENVOY_SERVICE= \ + $(kubectl get svc -n envoy-gateway-system \ + --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg \ + -o jsonpath='{.items[0].metadata.name}') ``` Port forward to the Envoy service: @@ -65,7 +71,10 @@ Curl the example app through Envoy proxy: curl --verbose --header "Host: www.example.com" http://localhost:8888/get ``` -### External LoadBalancer Support +{{% /tab %}} + +{{% tab name="External LoadBalancer Support" %}} +Get the name of the Envoy service created the by the example Gateway: You can also test the same functionality by sending traffic to the External IP. To get the external IP of the Envoy service, run: @@ -83,7 +92,9 @@ Curl the example app through Envoy proxy: curl --verbose --header "Host: www.example.com" http://$GATEWAY_HOST/get ``` -## Clean-Up +{{% /tab %}} + +{{% tab name="Clean-Up" %}} Use the steps in this section to uninstall everything from the quickstart guide. @@ -99,6 +110,9 @@ Delete the Gateway API CRDs and Envoy Gateway: helm uninstall eg -n envoy-gateway-system ``` +{{% /tab %}} +{{< /tabs >}} + ## Next Steps Checkout the [Developer Guide](../contributions/develop) to get involved in the project. diff --git a/site/layouts/shortcodes/common/_common.html b/site/layouts/shortcodes/common/_common.html new file mode 100644 index 00000000000..5abf51f5f9f --- /dev/null +++ b/site/layouts/shortcodes/common/_common.html @@ -0,0 +1,16 @@ +{{/* This file contains some common template definitions used in the blocks shortcodes. + The reasoning behind the long and hard-to-remember template names is that these templates are global. */}} + {{ define "shortcodes-blocks_getimage" }} + {{- $cr := site.GetPage "/_common-resources" -}} + {{- with $cr -}} + {{- $image := $cr.Resources.GetMatch (printf "images/**%s*" $.name ) -}} + {{- with $image -}} + {{- $.ctx.Scratch.Set $.target $image -}} + {{- else -}} + {{- errorf "Image matching %q not found _common-resources" $.name -}} + {{- end -}} + {{- else -}} + {{ errorf "[%s] No resource bundle found. Create an empty headless bundle; create content/%s/_common-resources/index.md with \"headless: true\" in front matter. See https://gohugo.io/content-management/page-bundles/#headless-bundle" $.ctx.Page.Lang $.ctx.Page.Lang }} + {{- end -}} + {{- end -}} + \ No newline at end of file diff --git a/site/layouts/shortcodes/tab.html b/site/layouts/shortcodes/tab.html new file mode 100644 index 00000000000..4db7465af9c --- /dev/null +++ b/site/layouts/shortcodes/tab.html @@ -0,0 +1,19 @@ +{{ if .Parent }} + {{ $name := trim (.Get "name") " " }} + {{ $include := trim (.Get "include") " "}} + {{ $codelang := .Get "codelang" }} + {{ if not (.Parent.Scratch.Get "tabs") }} + {{ .Parent.Scratch.Set "tabs" slice }} + {{ end }} + {{ with .Inner }} + {{ if $codelang }} + {{ $.Parent.Scratch.Add "tabs" (dict "name" $name "content" (highlight . $codelang "") ) }} + {{ else }} + {{ $.Parent.Scratch.Add "tabs" (dict "name" $name "content" . ) }} + {{ end }} + {{ else }} + {{ $.Parent.Scratch.Add "tabs" (dict "name" $name "include" $include "codelang" $codelang) }} + {{ end }} +{{ else }} + {{- errorf "[%s] %q: tab shortcode missing its parent" site.Language.Lang .Page.Path -}} +{{ end}} diff --git a/site/layouts/shortcodes/tabs.html b/site/layouts/shortcodes/tabs.html new file mode 100644 index 00000000000..aeb9582b282 --- /dev/null +++ b/site/layouts/shortcodes/tabs.html @@ -0,0 +1,50 @@ +{{- .Page.Scratch.Add "tabset-counter" 1 -}} +{{- $tab_set_id := .Get "name" | default (printf "tabset-%s-%d" (.Page.RelPermalink) (.Page.Scratch.Get "tabset-counter") ) | anchorize -}} +{{- $tabs := .Scratch.Get "tabs" -}} +{{- if .Inner -}}{{- /* We don't use the inner content, but Hugo will complain if we don't reference it. */ -}}{{- end -}} + +
+{{- range $i, $e := $tabs -}} +{{- $id := printf "%s-%d" $tab_set_id $i -}} +{{- if (eq $i 0) -}} +
+{{ else }} +
+{{ end }} +

+ {{- with .content -}} + {{- . -}} + {{- else -}} + {{- if eq $.Page.BundleType "leaf" -}} + {{- /* find the file somewhere inside the bundle. Note the use of double asterisk */ -}} + {{- with $.Page.Resources.GetMatch (printf "**%s*" .include) -}} + {{- if ne .ResourceType "page" -}} + {{- /* Assume it is a file that needs code highlighting. */ -}} + {{- $codelang := $e.codelang | default ( path.Ext .Name | strings.TrimPrefix ".") -}} + {{- highlight .Content $codelang "" -}} + {{- else -}} + {{- .Content -}} + {{- end -}} + {{- end -}} + {{- else -}} + {{- $path := path.Join $.Page.File.Dir .include -}} + {{- $page := site.GetPage "page" $path -}} + {{- with $page -}} + {{- .Content -}} + {{- else -}} + {{- errorf "[%s] tabs include not found for path %q" site.Language.Lang $path -}} + {{- end -}} + {{- end -}} + {{- end -}} +

+{{- end -}} +
diff --git a/site/static/img/texture.png b/site/static/img/texture.png new file mode 100644 index 0000000000000000000000000000000000000000..856707b05915a9dc228992c54a00efd137387eaf GIT binary patch literal 35987 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