Merge branch 'master' into f-autopilot
This commit is contained in:
commit
459e72b011
|
@ -36,10 +36,10 @@ type Command struct {
|
||||||
hidden *flag.FlagSet
|
hidden *flag.FlagSet
|
||||||
|
|
||||||
// These are the options which correspond to the HTTP API options
|
// These are the options which correspond to the HTTP API options
|
||||||
httpAddr stringValue
|
httpAddr StringValue
|
||||||
token stringValue
|
token StringValue
|
||||||
datacenter stringValue
|
datacenter StringValue
|
||||||
stale boolValue
|
stale BoolValue
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTPClient returns a client with the parsed flags. It panics if the command
|
// HTTPClient returns a client with the parsed flags. It panics if the command
|
||||||
|
|
|
@ -20,32 +20,32 @@ import (
|
||||||
|
|
||||||
// configDecodeHook should be passed to mapstructure in order to decode into
|
// configDecodeHook should be passed to mapstructure in order to decode into
|
||||||
// the *Value objects here.
|
// the *Value objects here.
|
||||||
var configDecodeHook = mapstructure.ComposeDecodeHookFunc(
|
var ConfigDecodeHook = mapstructure.ComposeDecodeHookFunc(
|
||||||
boolToBoolValueFunc(),
|
BoolToBoolValueFunc(),
|
||||||
stringToDurationValueFunc(),
|
StringToDurationValueFunc(),
|
||||||
stringToStringValueFunc(),
|
StringToStringValueFunc(),
|
||||||
float64ToUintValueFunc(),
|
Float64ToUintValueFunc(),
|
||||||
)
|
)
|
||||||
|
|
||||||
// boolValue provides a flag value that's aware if it has been set.
|
// BoolValue provides a flag value that's aware if it has been set.
|
||||||
type boolValue struct {
|
type BoolValue struct {
|
||||||
v *bool
|
v *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (b *boolValue) IsBoolFlag() bool {
|
func (b *BoolValue) IsBoolFlag() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge will overlay this value if it has been set.
|
// Merge will overlay this value if it has been set.
|
||||||
func (b *boolValue) Merge(onto *bool) {
|
func (b *BoolValue) Merge(onto *bool) {
|
||||||
if b.v != nil {
|
if b.v != nil {
|
||||||
*onto = *(b.v)
|
*onto = *(b.v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (b *boolValue) Set(v string) error {
|
func (b *BoolValue) Set(v string) error {
|
||||||
if b.v == nil {
|
if b.v == nil {
|
||||||
b.v = new(bool)
|
b.v = new(bool)
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ func (b *boolValue) Set(v string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (b *boolValue) String() string {
|
func (b *BoolValue) String() string {
|
||||||
var current bool
|
var current bool
|
||||||
if b.v != nil {
|
if b.v != nil {
|
||||||
current = *(b.v)
|
current = *(b.v)
|
||||||
|
@ -63,9 +63,9 @@ func (b *boolValue) String() string {
|
||||||
return fmt.Sprintf("%v", current)
|
return fmt.Sprintf("%v", current)
|
||||||
}
|
}
|
||||||
|
|
||||||
// boolToBoolValueFunc is a mapstructure hook that looks for an incoming bool
|
// BoolToBoolValueFunc is a mapstructure hook that looks for an incoming bool
|
||||||
// mapped to a boolValue and does the translation.
|
// mapped to a BoolValue and does the translation.
|
||||||
func boolToBoolValueFunc() mapstructure.DecodeHookFunc {
|
func BoolToBoolValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return func(
|
return func(
|
||||||
f reflect.Type,
|
f reflect.Type,
|
||||||
t reflect.Type,
|
t reflect.Type,
|
||||||
|
@ -74,7 +74,7 @@ func boolToBoolValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
val := boolValue{}
|
val := BoolValue{}
|
||||||
if t != reflect.TypeOf(val) {
|
if t != reflect.TypeOf(val) {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
@ -85,20 +85,20 @@ func boolToBoolValueFunc() mapstructure.DecodeHookFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// durationValue provides a flag value that's aware if it has been set.
|
// DurationValue provides a flag value that's aware if it has been set.
|
||||||
type durationValue struct {
|
type DurationValue struct {
|
||||||
v *time.Duration
|
v *time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge will overlay this value if it has been set.
|
// Merge will overlay this value if it has been set.
|
||||||
func (d *durationValue) Merge(onto *time.Duration) {
|
func (d *DurationValue) Merge(onto *time.Duration) {
|
||||||
if d.v != nil {
|
if d.v != nil {
|
||||||
*onto = *(d.v)
|
*onto = *(d.v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (d *durationValue) Set(v string) error {
|
func (d *DurationValue) Set(v string) error {
|
||||||
if d.v == nil {
|
if d.v == nil {
|
||||||
d.v = new(time.Duration)
|
d.v = new(time.Duration)
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ func (d *durationValue) Set(v string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (d *durationValue) String() string {
|
func (d *DurationValue) String() string {
|
||||||
var current time.Duration
|
var current time.Duration
|
||||||
if d.v != nil {
|
if d.v != nil {
|
||||||
current = *(d.v)
|
current = *(d.v)
|
||||||
|
@ -116,9 +116,9 @@ func (d *durationValue) String() string {
|
||||||
return current.String()
|
return current.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// stringToDurationValueFunc is a mapstructure hook that looks for an incoming
|
// StringToDurationValueFunc is a mapstructure hook that looks for an incoming
|
||||||
// string mapped to a durationValue and does the translation.
|
// string mapped to a DurationValue and does the translation.
|
||||||
func stringToDurationValueFunc() mapstructure.DecodeHookFunc {
|
func StringToDurationValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return func(
|
return func(
|
||||||
f reflect.Type,
|
f reflect.Type,
|
||||||
t reflect.Type,
|
t reflect.Type,
|
||||||
|
@ -127,7 +127,7 @@ func stringToDurationValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
val := durationValue{}
|
val := DurationValue{}
|
||||||
if t != reflect.TypeOf(val) {
|
if t != reflect.TypeOf(val) {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
@ -138,20 +138,20 @@ func stringToDurationValueFunc() mapstructure.DecodeHookFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// stringValue provides a flag value that's aware if it has been set.
|
// StringValue provides a flag value that's aware if it has been set.
|
||||||
type stringValue struct {
|
type StringValue struct {
|
||||||
v *string
|
v *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge will overlay this value if it has been set.
|
// Merge will overlay this value if it has been set.
|
||||||
func (s *stringValue) Merge(onto *string) {
|
func (s *StringValue) Merge(onto *string) {
|
||||||
if s.v != nil {
|
if s.v != nil {
|
||||||
*onto = *(s.v)
|
*onto = *(s.v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (s *stringValue) Set(v string) error {
|
func (s *StringValue) Set(v string) error {
|
||||||
if s.v == nil {
|
if s.v == nil {
|
||||||
s.v = new(string)
|
s.v = new(string)
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ func (s *stringValue) Set(v string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (s *stringValue) String() string {
|
func (s *StringValue) String() string {
|
||||||
var current string
|
var current string
|
||||||
if s.v != nil {
|
if s.v != nil {
|
||||||
current = *(s.v)
|
current = *(s.v)
|
||||||
|
@ -168,9 +168,9 @@ func (s *stringValue) String() string {
|
||||||
return current
|
return current
|
||||||
}
|
}
|
||||||
|
|
||||||
// stringToStringValueFunc is a mapstructure hook that looks for an incoming
|
// StringToStringValueFunc is a mapstructure hook that looks for an incoming
|
||||||
// string mapped to a stringValue and does the translation.
|
// string mapped to a StringValue and does the translation.
|
||||||
func stringToStringValueFunc() mapstructure.DecodeHookFunc {
|
func StringToStringValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return func(
|
return func(
|
||||||
f reflect.Type,
|
f reflect.Type,
|
||||||
t reflect.Type,
|
t reflect.Type,
|
||||||
|
@ -179,7 +179,7 @@ func stringToStringValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
val := stringValue{}
|
val := StringValue{}
|
||||||
if t != reflect.TypeOf(val) {
|
if t != reflect.TypeOf(val) {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
@ -189,20 +189,20 @@ func stringToStringValueFunc() mapstructure.DecodeHookFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// uintValue provides a flag value that's aware if it has been set.
|
// UintValue provides a flag value that's aware if it has been set.
|
||||||
type uintValue struct {
|
type UintValue struct {
|
||||||
v *uint
|
v *uint
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge will overlay this value if it has been set.
|
// Merge will overlay this value if it has been set.
|
||||||
func (u *uintValue) Merge(onto *uint) {
|
func (u *UintValue) Merge(onto *uint) {
|
||||||
if u.v != nil {
|
if u.v != nil {
|
||||||
*onto = *(u.v)
|
*onto = *(u.v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (u *uintValue) Set(v string) error {
|
func (u *UintValue) Set(v string) error {
|
||||||
if u.v == nil {
|
if u.v == nil {
|
||||||
u.v = new(uint)
|
u.v = new(uint)
|
||||||
}
|
}
|
||||||
|
@ -212,7 +212,7 @@ func (u *uintValue) Set(v string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// See flag.Value.
|
// See flag.Value.
|
||||||
func (u *uintValue) String() string {
|
func (u *UintValue) String() string {
|
||||||
var current uint
|
var current uint
|
||||||
if u.v != nil {
|
if u.v != nil {
|
||||||
current = *(u.v)
|
current = *(u.v)
|
||||||
|
@ -220,9 +220,9 @@ func (u *uintValue) String() string {
|
||||||
return fmt.Sprintf("%v", current)
|
return fmt.Sprintf("%v", current)
|
||||||
}
|
}
|
||||||
|
|
||||||
// float64ToUintValueFunc is a mapstructure hook that looks for an incoming
|
// Float64ToUintValueFunc is a mapstructure hook that looks for an incoming
|
||||||
// float64 mapped to a uintValue and does the translation.
|
// float64 mapped to a UintValue and does the translation.
|
||||||
func float64ToUintValueFunc() mapstructure.DecodeHookFunc {
|
func Float64ToUintValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return func(
|
return func(
|
||||||
f reflect.Type,
|
f reflect.Type,
|
||||||
t reflect.Type,
|
t reflect.Type,
|
||||||
|
@ -231,7 +231,7 @@ func float64ToUintValueFunc() mapstructure.DecodeHookFunc {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
val := uintValue{}
|
val := UintValue{}
|
||||||
if t != reflect.TypeOf(val) {
|
if t != reflect.TypeOf(val) {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
@ -254,14 +254,14 @@ func float64ToUintValueFunc() mapstructure.DecodeHookFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// visitFn is a callback that gets a chance to visit each file found during a
|
// VisitFn is a callback that gets a chance to visit each file found during a
|
||||||
// traversal with visit().
|
// traversal with visit().
|
||||||
type visitFn func(path string) error
|
type VisitFn func(path string) error
|
||||||
|
|
||||||
// visit will call the visitor function on the path if it's a file, or for each
|
// visit will call the visitor function on the path if it's a file, or for each
|
||||||
// file in the path if it's a directory. Directories will not be recursed into,
|
// file in the path if it's a directory. Directories will not be recursed into,
|
||||||
// and files in the directory will be visited in alphabetical order.
|
// and files in the directory will be visited in alphabetical order.
|
||||||
func visit(path string, visitor visitFn) error {
|
func Visit(path string, visitor VisitFn) error {
|
||||||
f, err := os.Open(path)
|
f, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error reading %q: %v", path, err)
|
return fmt.Errorf("error reading %q: %v", path, err)
|
||||||
|
|
|
@ -14,10 +14,10 @@ import (
|
||||||
|
|
||||||
func TestConfigUtil_Values(t *testing.T) {
|
func TestConfigUtil_Values(t *testing.T) {
|
||||||
type config struct {
|
type config struct {
|
||||||
B boolValue `mapstructure:"bool"`
|
B BoolValue `mapstructure:"bool"`
|
||||||
D durationValue `mapstructure:"duration"`
|
D DurationValue `mapstructure:"duration"`
|
||||||
S stringValue `mapstructure:"string"`
|
S StringValue `mapstructure:"string"`
|
||||||
U uintValue `mapstructure:"uint"`
|
U UintValue `mapstructure:"uint"`
|
||||||
}
|
}
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
|
@ -70,7 +70,7 @@ func TestConfigUtil_Values(t *testing.T) {
|
||||||
|
|
||||||
var r config
|
var r config
|
||||||
msdec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
msdec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||||
DecodeHook: configDecodeHook,
|
DecodeHook: ConfigDecodeHook,
|
||||||
Result: &r,
|
Result: &r,
|
||||||
ErrorUnused: true,
|
ErrorUnused: true,
|
||||||
})
|
})
|
||||||
|
@ -108,10 +108,10 @@ func TestConfigUtil_Visit(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
basePath := "../../test/command/merge"
|
basePath := "../../test/command/merge"
|
||||||
if err := visit(basePath, visitor); err != nil {
|
if err := Visit(basePath, visitor); err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if err := visit(path.Join(basePath, "subdir", "c.json"), visitor); err != nil {
|
if err := Visit(path.Join(basePath, "subdir", "c.json"), visitor); err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ const (
|
||||||
rpcTLS
|
rpcTLS
|
||||||
rpcMultiplexV2
|
rpcMultiplexV2
|
||||||
rpcSnapshot
|
rpcSnapshot
|
||||||
|
rpcGossip
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
BIN
website/source/assets/images/logo-header.png (Stored with Git LFS)
BIN
website/source/assets/images/logo-header.png (Stored with Git LFS)
Binary file not shown.
|
@ -0,0 +1,39 @@
|
||||||
|
|
||||||
|
<svg width="155px" height="48px" viewBox="460 399 155 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<desc>HashiCorp Consul</desc>
|
||||||
|
<defs>
|
||||||
|
<polygon id="path-1" points="5.37248241 25.3378046 5.37248241 0.648776721 1.01772158 0.648776721 1.01772158 25.3378046 5.37248241 25.3378046"></polygon>
|
||||||
|
<polygon id="path-3" points="38.8349341 7.7377226e-05 0.000398916643 7.7377226e-05 0.000398916643 46.8650645 38.8349341 46.8650645 38.8349341 7.7377226e-05"></polygon>
|
||||||
|
</defs>
|
||||||
|
<g id="Group-3" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(460.000000, 399.000000)">
|
||||||
|
<g id="Group-2" transform="translate(62.149421, 10.514255)">
|
||||||
|
<path d="M0.483443453,9.01263583 C0.483443453,4.72754033 3.01832299,2.23492511 8.94370387,2.23492511 C11.1575824,2.23492511 13.4422869,2.51587813 15.4059903,3.00698401 L14.90564,6.83581181 C12.9784919,6.48405863 10.7292004,6.23794378 9.0864979,6.23794378 C5.98044226,6.23794378 4.98202643,7.29207952 4.98202643,9.78469474 L4.98202643,18.7763153 C4.98202643,21.2689305 5.98044226,22.3230662 9.0864979,22.3230662 C10.7292004,22.3230662 12.9784919,22.0769514 14.90564,21.726322 L15.4059903,25.554026 C13.4422869,26.0451319 11.1575824,26.3260849 8.94370387,26.3260849 C3.01832299,26.3260849 0.483443453,23.8334697 0.483443453,19.5483742 L0.483443453,9.01263583 Z" id="Fill-1" fill="#FFFFFF"></path>
|
||||||
|
<path d="M25.0440158,12.1733573 C22.7238985,12.1733573 21.8305791,13.1915311 21.8305791,15.1233641 L21.8305791,19.7242508 C21.8305791,21.6560838 22.7238985,22.6742575 25.0440158,22.6742575 C27.3641332,22.6742575 28.2574526,21.6560838 28.2574526,19.7242508 L28.2574526,15.1233641 C28.2574526,13.1915311 27.3641332,12.1733573 25.0440158,12.1733573 M25.0440158,26.3266468 C19.0820797,26.3266468 17.4759325,23.0956871 17.4759325,19.5837743 L17.4759325,15.2638406 C17.4759325,11.7519278 19.0820797,8.52096804 25.0440158,8.52096804 C31.005952,8.52096804 32.6120992,11.7519278 32.6120992,15.2638406 L32.6120992,19.5837743 C32.6120992,23.0956871 31.005952,26.3266468 25.0440158,26.3266468" id="Fill-3" fill="#FFFFFF"></path>
|
||||||
|
<path d="M45.8550456,25.9751184 L45.8550456,14.0346149 C45.8550456,13.1209557 45.4620764,12.664688 44.4625182,12.664688 C43.3921342,12.664688 41.4992566,13.2973942 39.9296647,14.1042913 L39.9296647,25.9751184 L35.5738757,25.9751184 L35.5738757,8.87182218 L38.8935512,8.87182218 L39.3219333,10.3114255 C41.4992566,9.25841354 44.2488984,8.52119281 46.2834277,8.52119281 C49.1747211,8.52119281 50.2108345,10.5227021 50.2108345,13.5783472 L50.2108345,25.9751184 L45.8550456,25.9751184 Z" id="Fill-5" fill="#FFFFFF"></path>
|
||||||
|
<path d="M59.1706456,26.3263097 C57.3143232,26.3263097 54.7794437,25.9048801 53.1732965,25.3429741 L53.7798855,22.0771762 C55.2432387,22.4986057 57.1715292,22.8143969 58.9570257,22.8143969 C60.8841739,22.8143969 61.1697619,22.3929674 61.1697619,21.0938406 C61.1697619,20.0397048 60.9549997,19.5137608 58.1356745,18.8462164 C53.8872666,17.8280426 53.3880587,16.7739069 53.3880587,13.472147 C53.3880587,10.0310344 54.9222377,8.5206309 59.8846157,8.5206309 C61.4907629,8.5206309 63.5972604,8.73190757 65.0960265,9.11737512 L64.6676444,12.5247734 C63.3470852,12.2786585 61.2405878,12.0325437 59.8846157,12.0325437 C57.9928804,12.0325437 57.6718795,12.4539732 57.6718795,13.508109 C57.6718795,14.8769121 57.7781182,14.9825504 60.1347908,15.5792946 C64.9897877,16.8435833 65.4535827,17.4762895 65.4535827,20.9882022 C65.4535827,24.2899622 64.4186116,26.3263097 59.1706456,26.3263097" id="Fill-7" fill="#FFFFFF"></path>
|
||||||
|
<path d="M72.664681,8.87215932 L72.664681,20.8126628 C72.664681,21.726322 73.0576501,22.1825897 74.0572083,22.1825897 C75.1275923,22.1825897 77.0204699,21.5498835 78.5900619,20.7429864 L78.5900619,8.87215932 L82.9458508,8.87215932 L82.9458508,25.9754555 L79.6261753,25.9754555 L79.1977932,24.5358523 C77.0204699,25.5888642 74.2708282,26.3260849 72.2362989,26.3260849 C69.3450055,26.3260849 68.308892,24.3245756 68.308892,21.2689305 L68.308892,8.87215932 L72.664681,8.87215932 Z" id="Fill-9" fill="#FFFFFF"></path>
|
||||||
|
<g id="Group-13" transform="translate(85.676415, 0.637314)">
|
||||||
|
<mask id="mask-2" fill="white">
|
||||||
|
<use xlink:href="#path-1"></use>
|
||||||
|
</mask>
|
||||||
|
<g id="Clip-12"></g>
|
||||||
|
<polygon id="Fill-11" fill="#FFFFFF" mask="url(#mask-2)" points="1.01772158 25.3378046 1.01772158 1.24664475 5.37351053 0.648776721 5.37351053 25.3378046"></polygon>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(0.462402, 0.399946)">
|
||||||
|
<path d="M24.0715876,28.4294761 C21.184229,28.4294761 18.8497688,26.1855366 18.8497688,23.384481 C18.8497688,20.5841992 21.1634853,18.3209153 24.0524396,18.3209153 C26.9397983,18.3209153 29.2734606,20.5648549 29.2734606,23.3651367 C29.2934065,26.1661923 26.9589463,28.4194171 24.0715876,28.4294761" id="Fill-14" fill="#FFFFFF"></path>
|
||||||
|
<path d="M34.2151602,25.7057204 C32.8827786,25.7057204 31.8112885,24.667318 31.8112885,23.3743446 C31.8112885,22.0821449 32.8827786,21.0437425 34.2151602,21.0437425 C35.5483396,21.0437425 36.6190319,22.0821449 36.6190319,23.3743446 C36.6190319,24.667318 35.5483396,25.7057204 34.2151602,25.7057204" id="Fill-16" fill="#FFFFFF"></path>
|
||||||
|
<path d="M43.0107935,27.9035431 L43.0107935,27.9035431 C42.6884688,29.1493164 41.3800223,29.9006493 40.0947128,29.5880453 C38.8094034,29.2762151 38.0371008,28.0080024 38.3578298,26.7599077 C38.6793566,25.5141344 39.988601,24.764349 41.2731126,25.0754055 C42.4977867,25.3880095 43.2724828,26.5308711 43.0586635,27.7193853 C43.0347285,27.7766445 43.0347285,27.8339036 43.0107935,27.9035431" id="Fill-18" fill="#FFFFFF"></path>
|
||||||
|
<path d="M41.3083768,21.8976776 C40.0238652,22.1870684 38.7146208,21.424129 38.4162312,20.1551425 C38.120235,18.9085953 38.9045051,17.6396088 40.2009842,17.3517656 C41.4870915,17.0623747 42.7955381,17.8237666 43.0931299,19.0927531 C43.1537652,19.4053571 43.1761045,19.7164136 43.1178627,20.0050306 C42.9862202,20.9173081 42.2944988,21.6903066 41.3083768,21.8976776" id="Fill-20" fill="#FFFFFF"></path>
|
||||||
|
<path d="M49.8585966,27.6447163 C49.6439794,28.9144766 48.3834028,29.7679474 47.0749562,29.5373632 C45.7657118,29.3292185 44.8857017,28.1066583 45.1226582,26.8376718 C45.3372753,25.5679115 46.5986498,24.713667 47.9078942,24.9450249 C49.143738,25.1523958 50.0125784,26.2488311 49.9064666,27.4365715 C49.8825316,27.5069848 49.8585966,27.5634702 49.8585966,27.6447163" id="Fill-22" fill="#FFFFFF"></path>
|
||||||
|
<path d="M47.9045433,21.7960813 C46.5952989,22.0034522 45.3586573,21.1499814 45.144838,19.8802212 C44.9302208,18.6104609 45.8110288,17.4111139 47.1202732,17.2029691 C48.4287198,16.9955982 49.6653614,17.8498428 49.8799785,19.119603 C49.9039135,19.326974 49.9278485,19.5111318 49.9039135,19.7185028 C49.8193432,20.7344657 48.9991706,21.6351367 47.9045433,21.7960813" id="Fill-24" fill="#FFFFFF"></path>
|
||||||
|
<path d="M46.226301,35.7191072 L46.226301,35.7191072 C45.5593124,36.8387557 44.1088514,37.2426648 42.9416213,36.5965649 C41.7871566,35.9496913 41.3706876,34.5421996 42.0368784,33.4117183 C42.703867,32.2912961 44.1543279,31.887387 45.321558,32.5342606 C46.1536981,32.9954288 46.6068675,33.8844932 46.5238928,34.7619509 C46.5119253,35.0962205 46.4042178,35.407277 46.226301,35.7191072" id="Fill-26" fill="#FFFFFF"></path>
|
||||||
|
<path d="M45.359136,14.296371 C44.2046712,14.9200315 42.741445,14.5277289 42.0752542,13.4080805 C41.4322006,12.2892058 41.836702,10.8685599 42.9911668,10.2224601 C44.1456316,9.59957341 45.6088578,9.99187595 46.2750486,11.1115244 C46.5383336,11.5502533 46.6197126,12.0005887 46.5726404,12.461757 C46.5024311,13.2115423 46.0739946,13.9040685 45.359136,14.296371" id="Fill-28" fill="#FFFFFF"></path>
|
||||||
|
<mask id="mask-4" fill="white">
|
||||||
|
<use xlink:href="#path-3"></use>
|
||||||
|
</mask>
|
||||||
|
<g id="Clip-31"></g>
|
||||||
|
<path d="M24.1611843,46.8650645 C17.6939477,46.8650645 11.6224364,44.4315507 7.06521266,40.0117636 C2.50798893,35.5703108 0.000398916643,29.6842252 0.000398916643,23.4321453 C0.000398916643,17.161495 2.50878677,11.2730881 7.06521266,6.85330091 C11.6471692,2.43196621 17.7170848,0 24.1611843,0 C29.5234218,0 34.5968437,1.66438413 38.8349341,4.81286346 L35.8821531,8.5494097 C32.49934,6.0361974 28.4471447,4.70685666 24.1611843,4.70685666 C19.0079791,4.70685666 14.1547592,6.65134635 10.4935023,10.1843905 C6.857776,13.7120182 4.85361879,18.4196486 4.85361879,23.4321453 C4.85361879,28.4314879 6.85937167,33.1391184 10.5014806,36.6853166 C14.1380047,40.2129444 18.9904268,42.1582078 24.1611843,42.1582078 C28.4415599,42.1582078 32.494553,40.8288671 35.8837488,38.3141072 L38.8325406,42.0537486 C34.5896632,45.2006803 29.5170391,46.8650645 24.1611843,46.8650645" id="Fill-30" fill="#FFFFFF" mask="url(#mask-4)"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
BIN
website/source/assets/images/logo-header@2x.png (Stored with Git LFS)
BIN
website/source/assets/images/logo-header@2x.png (Stored with Git LFS)
Binary file not shown.
|
@ -8,6 +8,11 @@ body.layout-intro{
|
||||||
|
|
||||||
#main-content{
|
#main-content{
|
||||||
min-height: 600px;
|
min-height: 600px;
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5 {
|
||||||
|
font-family: $font-family-open-sans;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
>.container{
|
>.container{
|
||||||
|
@ -103,34 +108,33 @@ body.layout-intro{
|
||||||
|
|
||||||
/*> a:hover,
|
/*> a:hover,
|
||||||
> a:focus {
|
> a:focus {
|
||||||
font-weight: $font-weight-museo-xb;
|
font-weight: font-weight-xb;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
.nav {
|
.nav {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
li.active a {
|
li.active a {
|
||||||
font-weight: $font-weight-museo-xb;
|
font-weight: font-weight-xb;
|
||||||
}
|
}
|
||||||
|
|
||||||
li.active .subnav {
|
li.active .subnav {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
li a {
|
li a {
|
||||||
font-weight: $font-weight-museo-sb;
|
font-weight: $font-weight-sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
li.active a {
|
li.active a {
|
||||||
font-weight: $font-weight-museo-xb;
|
font-weight: font-weight-xb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
> a {
|
> a {
|
||||||
text-transform: uppercase;
|
font-family: $font-family-open-sans;
|
||||||
font-family: $font-family-museo;
|
font-weight: 600;
|
||||||
font-weight: $font-weight-museo-sb;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,9 +147,9 @@ body.layout-intro{
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
|
|
||||||
> a{
|
> a{
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
font-family: $font-family-source-sans;
|
|
||||||
padding: 6px 15px;
|
padding: 6px 15px;
|
||||||
|
font-weight: 500;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subnav {
|
.subnav {
|
||||||
|
@ -156,7 +160,6 @@ body.layout-intro{
|
||||||
padding: 6px 0;
|
padding: 6px 0;
|
||||||
> a{
|
> a{
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
font-family: $font-family-source-sans;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,9 +191,8 @@ body.layout-intro{
|
||||||
}
|
}
|
||||||
|
|
||||||
p, li, .alert {
|
p, li, .alert {
|
||||||
font-size: 20px;
|
font-size: 18px;
|
||||||
font-family: $font-family-source-sans;
|
font-weight: 400;
|
||||||
font-weight: $font-weight-open;
|
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
margin: 0 0 18px;
|
margin: 0 0 18px;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
|
@ -234,6 +236,7 @@ body.layout-intro{
|
||||||
}
|
}
|
||||||
|
|
||||||
h2, h3, h4{
|
h2, h3, h4{
|
||||||
|
margin-top: 42px;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
//
|
|
||||||
// Typography
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
//light
|
|
||||||
.rls-l{
|
|
||||||
font-family: $font-family-museo;
|
|
||||||
font-weight: $font-weight-museo-xl;
|
|
||||||
}
|
|
||||||
|
|
||||||
//semibold
|
|
||||||
.rls-sb{
|
|
||||||
font-family: $font-family-museo;
|
|
||||||
font-weight: $font-weight-museo-sb;
|
|
||||||
}
|
|
||||||
|
|
||||||
//extrabold
|
|
||||||
.rls-xb{
|
|
||||||
font-family: $font-family-museo;
|
|
||||||
font-weight: $font-weight-museo-xb;
|
|
||||||
}
|
|
|
@ -13,19 +13,26 @@ body {
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5 {
|
||||||
|
font-family: $font-family-klavika;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
h1{
|
h1{
|
||||||
font-size: 42px;
|
font-size: 42px;
|
||||||
line-height: 42px;
|
line-height: 42px;
|
||||||
font-family: $font-family-museo;
|
font-weight: $font-weight-sb;
|
||||||
font-weight: $font-weight-museo-sb;
|
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3{
|
h3{
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
font-family: $font-family-museo;
|
font-weight: $font-weight-sb;
|
||||||
font-weight: $font-weight-museo-sb;
|
}
|
||||||
|
|
||||||
|
p, a, input, .alert {
|
||||||
|
font-family: $font-family-open-sans;
|
||||||
}
|
}
|
||||||
|
|
||||||
//an alternative color for buttons in the doc body
|
//an alternative color for buttons in the doc body
|
||||||
|
|
|
@ -27,8 +27,8 @@ body.page-sub{
|
||||||
background-position: 0 center;
|
background-position: 0 center;
|
||||||
font-size: 0;
|
font-size: 0;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
@include img-retina("../images/consul-header-lockup.png", "../images/consul-header-lockup@2x.png", $project-logo-width, $project-logo-height);
|
background: url("../images/logo-header.svg") center no-repeat;
|
||||||
background-position: 0 center;
|
background-size: 100%;
|
||||||
|
|
||||||
&:hover{
|
&:hover{
|
||||||
opacity: .4;
|
opacity: .4;
|
||||||
|
@ -56,18 +56,9 @@ body.page-sub{
|
||||||
.navbar-brand {
|
.navbar-brand {
|
||||||
.logo{
|
.logo{
|
||||||
width: $project-logo-width * .75;
|
width: $project-logo-width * .75;
|
||||||
@include img-retina("../images/consul-header-lockup.png", "../images/consul-header-lockup@2x.png", $project-logo-width * .75, $project-logo-height * .75);
|
}
|
||||||
}
|
.by-hashicorp{
|
||||||
}
|
margin-top: 2px;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: 320px) {
|
|
||||||
#header {
|
|
||||||
.navbar-brand {
|
|
||||||
.logo{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,18 +19,17 @@ body.page-home{
|
||||||
|
|
||||||
h2{
|
h2{
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
letter-spacing: 2px;
|
letter-spacing: 1px;
|
||||||
color: $purple;
|
color: $purple;
|
||||||
font-family: $font-family-museo;
|
font-family: $font-family-klavika;
|
||||||
font-weight: $font-weight-museo-xb;
|
font-weight: font-weight-xb;
|
||||||
}
|
}
|
||||||
p{
|
p{
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
letter-spacing: 1px;
|
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
color: $consul-gray;
|
color: $consul-gray;
|
||||||
font-family: $font-family-museo;
|
font-family: $font-family-open-sans;
|
||||||
font-weight: $font-weight-museo-sb;
|
font-weight: $font-weight-sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.icn{
|
.icn{
|
||||||
|
@ -108,30 +107,26 @@ body.page-home{
|
||||||
}
|
}
|
||||||
|
|
||||||
p{
|
p{
|
||||||
font-size: 14px;
|
font-size: 18px;
|
||||||
letter-spacing: 1px;
|
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
color: $consul-gray;
|
color: $consul-gray;
|
||||||
font-family: $font-family-museo;
|
font-weight: $font-weight-sb;
|
||||||
font-weight: $font-weight-museo-sb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.outline-btn {
|
.outline-btn {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 3px;
|
letter-spacing: 1px;
|
||||||
color: $purple;
|
color: $purple;
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -150,17 +145,16 @@ body.page-home{
|
||||||
h2 {
|
h2 {
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
font-family: $font-family-museo;
|
font-family: $font-family-klavika;
|
||||||
font-weight: $font-weight-museo-xb;
|
font-weight: font-weight-xb;
|
||||||
}
|
}
|
||||||
|
|
||||||
p{
|
p{
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
letter-spacing: 1px;
|
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
color: $consul-gray;
|
color: $consul-gray;
|
||||||
font-family: $font-family-museo;
|
font-family: $font-family-open-sans;
|
||||||
font-weight: $font-weight-museo-sb;
|
font-weight: $font-weight-sb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,8 +207,8 @@ body.page-home{
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
color: $gray-darker;
|
color: $gray-darker;
|
||||||
font-family: $font-family-museo;
|
font-family: $font-family-klavika;
|
||||||
font-weight: $font-weight-museo-xb;
|
font-weight: font-weight-xb;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.shell-dots{
|
ul.shell-dots{
|
||||||
|
@ -239,7 +233,6 @@ body.page-home{
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-family: "Courier New", Monaco, Menlo, Consolas, monospace;
|
|
||||||
color: $white;
|
color: $white;
|
||||||
|
|
||||||
.txt-r {
|
.txt-r {
|
||||||
|
@ -251,6 +244,7 @@ body.page-home{
|
||||||
}
|
}
|
||||||
p{
|
p{
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
|
font-family: $font-family-mono;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
.cursor {
|
.cursor {
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin-top: $header-height;
|
margin-top: $header-height;
|
||||||
|
padding-left: 0;
|
||||||
-webkit-backface-visibility:hidden;
|
-webkit-backface-visibility:hidden;
|
||||||
|
|
||||||
.jumbo-logo-wrap{
|
.jumbo-logo-wrap{
|
||||||
|
@ -58,18 +59,23 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
h2{
|
h2{
|
||||||
margin-top: 175px;
|
margin-top: 220px;
|
||||||
font-size: 40px;
|
font-size: 40px;
|
||||||
line-height: 48px;
|
line-height: 48px;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
margin-left: 40px;
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-weight: $font-weight-sb;
|
||||||
|
letter-spacing: .5px;
|
||||||
|
opacity: .89;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 992px) {
|
@media (max-width: 992px) {
|
||||||
#jumbotron .container {
|
#jumbotron .container {
|
||||||
h2{
|
h2, p.lead{
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
|
@ -82,7 +88,7 @@
|
||||||
@media (max-width: 480px) {
|
@media (max-width: 480px) {
|
||||||
#jumbotron .container {
|
#jumbotron .container {
|
||||||
h2{
|
h2{
|
||||||
margin-top: 130px;
|
margin-top: 200px;
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,13 +46,14 @@ $link-hover-color: darken($link-color, 15%);
|
||||||
|
|
||||||
// Typography
|
// Typography
|
||||||
// -------------------------
|
// -------------------------
|
||||||
$font-family-museo: 'museo-sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
|
$font-family-open-sans: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
$font-family-source-sans: 'Source Sans Pro', "Helvetica Neue", Helvetica, Arial, sans-serif;
|
$font-family-klavika: "klavika-web", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
$font-weight-museo-xl: 100;
|
$font-family-mono: "Courier New", Monaco, Menlo, Consolas, monospace;
|
||||||
$font-weight-museo-reg: 300;
|
$font-weight-xl: 100;
|
||||||
$font-weight-museo-sb: 500;
|
$font-weight-reg: 300;
|
||||||
$font-weight-museo-xb: 700;
|
$font-weight-sb: 500;
|
||||||
$font-weight-open: $font-weight-museo-reg;
|
$font-weight-xb: 700;
|
||||||
|
$font-weight-open: $font-weight-reg;
|
||||||
|
|
||||||
|
|
||||||
$text-shadow: 1px 1px 1px #000;
|
$text-shadow: 1px 1px 1px #000;
|
||||||
|
|
|
@ -11,9 +11,6 @@
|
||||||
// Utility classes
|
// Utility classes
|
||||||
@import "_utilities";
|
@import "_utilities";
|
||||||
|
|
||||||
// Core CSS
|
|
||||||
@import "_fonts";
|
|
||||||
|
|
||||||
//Global Site
|
//Global Site
|
||||||
@import "_global";
|
@import "_global";
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
$project-logo-width: 147px;
|
$project-logo-width: 154px;
|
||||||
$project-logo-height: 40px;
|
$project-logo-height: 48px;
|
||||||
$project-logo-pad-left: 0px;
|
$project-logo-pad-left: 0px;
|
||||||
$header-height: 80px;
|
$header-height: 80px;
|
||||||
|
|
||||||
|
|
|
@ -12,9 +12,11 @@ description: |-
|
||||||
<div class="col-lg-6 col-md-6">
|
<div class="col-lg-6 col-md-6">
|
||||||
<h2 class="rls-l">
|
<h2 class="rls-l">
|
||||||
Service discovery and configuration made easy.
|
Service discovery and configuration made easy.
|
||||||
|
</h2>
|
||||||
|
<p class="lead">
|
||||||
Distributed, highly available, and
|
Distributed, highly available, and
|
||||||
datacenter-aware.
|
datacenter-aware.
|
||||||
</h2>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="jumbo-logo-wrap col-lg-offset-1 col-lg-5 col-md-6 hidden-xs hidden-sm">
|
<div class="jumbo-logo-wrap col-lg-offset-1 col-lg-5 col-md-6 hidden-xs hidden-sm">
|
||||||
<div class="jumbo-logo"></div>
|
<div class="jumbo-logo"></div>
|
||||||
|
|
|
@ -29,6 +29,10 @@
|
||||||
})(window,document,'script','dataLayer','GTM-NR2SD7C');</script>
|
})(window,document,'script','dataLayer','GTM-NR2SD7C');</script>
|
||||||
<!-- End Google Tag Manager -->
|
<!-- End Google Tag Manager -->
|
||||||
|
|
||||||
|
<!-- Typekit script to import Klavika font -->
|
||||||
|
<script src="https://use.typekit.net/wxf7mfi.js"></script>
|
||||||
|
<script>try{Typekit.load({ async: true });}catch(e){}</script>
|
||||||
|
|
||||||
<%= yield_content :head %>
|
<%= yield_content :head %>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue