diff --git a/.changelog/11956.txt b/.changelog/11956.txt new file mode 100644 index 0000000000..716a6f1ae6 --- /dev/null +++ b/.changelog/11956.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ci: Enable security scanning for CRT +``` diff --git a/.changelog/12166.txt b/.changelog/12166.txt new file mode 100644 index 0000000000..06b4340003 --- /dev/null +++ b/.changelog/12166.txt @@ -0,0 +1,3 @@ +```release-note:deprecation +acl: The `consul.acl.ResolveTokenToIdentity` metric is no longer reported. The values that were previous reported as part of this metric will now be part of the `consul.acl.ResolveToken` metric. +``` diff --git a/.changelog/12209.txt b/.changelog/12209.txt new file mode 100644 index 0000000000..5847b091c5 --- /dev/null +++ b/.changelog/12209.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +ui: Use @hashicorp/flight icons for all our icons. +``` diff --git a/.changelog/12267.txt b/.changelog/12267.txt new file mode 100644 index 0000000000..ca9106c0e2 --- /dev/null +++ b/.changelog/12267.txt @@ -0,0 +1,3 @@ +```release-note:bug +ca: adjust validation of PrivateKeyType/Bits with the Vault provider, to remove the error when the cert is created manually in Vault. +``` diff --git a/.circleci/config.yml b/.circleci/config.yml index cb1b1a5885..02fb797700 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -359,7 +359,7 @@ jobs: path: /tmp/jsonfile - run: *notify-slack-failure - # build all distros + # build is a templated job for build-x build-distros: &build-distros docker: - image: *GOLANG_IMAGE @@ -367,7 +367,13 @@ jobs: <<: *ENVIRONMENT steps: - checkout - - run: ./build-support/scripts/build-local.sh + - run: + name: Build + command: | + for os in $XC_OS; do + target="./pkg/bin/${GOOS}_${GOARCH}/" + GOOS="$os" CGO_ENABLED=0 go build -o "$target" -ldflags "$(GOLDFLAGS)" -tags "$(GOTAGS)" + done # save dev build to CircleCI - store_artifacts: @@ -380,7 +386,7 @@ jobs: environment: <<: *build-env XC_OS: "freebsd linux windows" - XC_ARCH: "386" + GOARCH: "386" # build all amd64 architecture supported OS binaries build-amd64: @@ -388,7 +394,7 @@ jobs: environment: <<: *build-env XC_OS: "darwin freebsd linux solaris windows" - XC_ARCH: "amd64" + GOARCH: "amd64" # build all arm/arm64 architecture supported OS binaries build-arm: @@ -433,7 +439,11 @@ jobs: - attach_workspace: # this normally runs as the first job and has nothing to attach; only used in main branch after rebuilding UI at: . - run: - command: make dev + name: Build + command: | + make dev + mkdir -p /home/circleci/go/bin + cp ./bin/consul /home/circleci/go/bin/consul # save dev build to pass to downstream jobs - persist_to_workspace: diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9b55be796f..a2e713e003 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,4 +1,5 @@ # Contributing to Consul + >**Note:** We take Consul's security and our users' trust very seriously. >If you believe you have found a security issue in Consul, please responsibly >disclose by contacting us at security@hashicorp.com. @@ -14,7 +15,9 @@ talk to us! A great way to do this is in issues themselves. When you want to work on an issue, comment on it first and tell us the approach you want to take. ## Getting Started + ### Some Ways to Contribute + * Report potential bugs. * Suggest product enhancements. * Increase our test coverage. @@ -24,7 +27,8 @@ work on an issue, comment on it first and tell us the approach you want to take. are deployed from this repo. * Respond to questions about usage on the issue tracker or the Consul section of the [HashiCorp forum]: (https://discuss.hashicorp.com/c/consul) -### Reporting an Issue: +### Reporting an Issue + >Note: Issues on GitHub for Consul are intended to be related to bugs or feature requests. >Questions should be directed to other community resources such as the: [Discuss Forum](https://discuss.hashicorp.com/c/consul/29), [FAQ](https://www.consul.io/docs/faq.html), or [Guides](https://www.consul.io/docs/guides/index.html). @@ -53,68 +57,95 @@ issue. Stale issues will be closed. 4. The issue is addressed in a pull request or commit. The issue will be referenced in the commit message so that the code that fixes it is clearly - linked. + linked. Any change a Consul user might need to know about will include a + changelog entry in the PR. 5. The issue is closed. -## Building Consul - -If you wish to work on Consul itself, you'll first need [Go](https://golang.org) -installed (The version of Go should match the one of our [CI config's](https://github.com/hashicorp/consul/blob/main/.circleci/config.yml) Go image). - - -Next, clone this repository and then run `make dev`. In a few moments, you'll have a working -`consul` executable in `consul/bin` and `$GOPATH/bin`: - ->Note: `make dev` will build for your local machine's os/architecture. If you wish to build for all os/architecture combinations use `make`. - ## Making Changes to Consul -The first step to making changes is to fork Consul. Afterwards, the easiest way -to work on the fork is to set it as a remote of the Consul project: +### Prerequisites -1. Navigate to `$GOPATH/src/github.com/hashicorp/consul` -2. Rename the existing remote's name: `git remote rename origin upstream`. -3. Add your fork as a remote by running - `git remote add origin `. For example: - `git remote add origin https://github.com/myusername/consul`. -4. Checkout a feature branch: `git checkout -t -b new-feature` -5. Make changes -6. Push changes to the fork when ready to submit PR: - `git push -u origin new-feature` +If you wish to work on Consul itself, you'll first need to: +- install [Go](https://golang.org) (the version should match that of our + [CI config's](https://github.com/hashicorp/consul/blob/main/.circleci/config.yml) Go image). +- [fork the Consul repo](../docs/contributing/fork-the-project.md) -By following these steps you can push to your fork to create a PR, but the code on disk still -lives in the spot where the go cli tools are expecting to find it. +### Building Consul ->Note: If you make any changes to the code, run `gofmt -s -w` to automatically format the code according to Go standards. +To build Consul, run `make dev`. In a few moments, you'll have a working +`consul` executable in `consul/bin` and `$GOPATH/bin`: -## Testing +>Note: `make dev` will build for your local machine's os/architecture. If you wish to build for all os/architecture combinations, use `make`. -During development, it may be more convenient to check your work-in-progress by running only the tests which you expect to be affected by your changes, as the full test suite can take several minutes to execute. [Go's built-in test tool](https://golang.org/pkg/cmd/go/internal/test/) allows specifying a list of packages to test and the `-run` option to only include test names matching a regular expression. -The `go test -short` flag can also be used to skip slower tests. +### Modifying the Code -Examples (run from the repository root): -- `go test -v ./connect` will run all tests in the connect package (see `./connect` folder) -- `go test -v -run TestRetryJoin ./command/agent` will run all tests in the agent package (see `./command/agent` folder) with name substring `TestRetryJoin` +#### Code Formatting -When a pull request is opened CI will run all tests and lint to verify the change. +Go provides [tooling to apply consistent code formatting](https://golang.org/doc/effective_go#formatting). +If you make any changes to the code, run `gofmt -s -w` to automatically format the code according to Go standards. -## Go Module Dependencies +#### Updating Go Module Dependencies If a dependency is added or change, run `go mod tidy` to update `go.mod` and `go.sum`. -## Developer Documentation +#### Developer Documentation -Documentation about the Consul code base is under [./docs], +Developer-focused documentation about the Consul code base is under [./docs], and godoc package document can be read at [pkg.go.dev/github.com/hashicorp/consul]. [./docs]: ../docs/README.md [pkg.go.dev/github.com/hashicorp/consul]: https://pkg.go.dev/github.com/hashicorp/consul -### Checklists +### Testing + +During development, it may be more convenient to check your work-in-progress by running only the tests which you expect to be affected by your changes, as the full test suite can take several minutes to execute. [Go's built-in test tool](https://golang.org/pkg/cmd/go/internal/test/) allows specifying a list of packages to test and the `-run` option to only include test names matching a regular expression. +The `go test -short` flag can also be used to skip slower tests. + +Examples (run from the repository root): +- `go test -v ./connect` will run all tests in the connect package (see `./connect` folder) +- `go test -v -run TestRetryJoin ./command/agent` will run all tests in the agent package (see `./command/agent` folder) with name substring `TestRetryJoin` -Some common changes that many PRs require such as adding config fields, are -documented through checklists. +When a pull request is opened CI will run all tests and lint to verify the change. -Please check in [docs/](../docs/) for any `checklist-*.md` files that might help -with your change. +### Submitting a Pull Request + +Before writing any code, we recommend: +- Create a Github issue if none already exists for the code change you'd like to make. +- Write a comment on the Github issue indicating you're interested in contributing so +maintainers can provide their perspective if needed. + +Keep your pull requests (PRs) small and open them early so you can get feedback on +approach from maintainers before investing your time in larger changes. For example, +see how [applying URL-decoding of resource names across the whole HTTP API](https://github.com/hashicorp/consul/issues/11258) +started with [iterating on the right approach for a few endpoints](https://github.com/hashicorp/consul/pull/11335) +before applying more broadly. + +When you're ready to submit a pull request: +1. Review the [list of checklists](#checklists) for common changes and follow any + that apply to your work. +2. Include evidence that your changes work as intended (e.g., add/modify unit tests; + describe manual tests you ran, in what environment, + and the results including screenshots or terminal output). +3. Open the PR from your fork against base repository `hashicorp/consul` and branch `main`. + - [Link the PR to its associated issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue). +4. Include any specific questions that you have for the reviewer in the PR description + or as a PR comment in Github. + - If there's anything you find the need to explain or clarify in the PR, consider + whether that explanation should be added in the source code as comments. + - You can submit a [draft PR](https://github.blog/2019-02-14-introducing-draft-pull-requests/) + if your changes aren't finalized but would benefit from in-process feedback. +5. If there's any reason Consul users might need to know about this change, + [add a changelog entry](../docs/contributing/add-a-changelog-entry.md). +6. After you submit, the Consul maintainers team needs time to carefully review your + contribution and ensure it is production-ready, considering factors such as: security, + backwards-compatibility, potential regressions, etc. +7. After you address Consul maintainer feedback and the PR is approved, a Consul maintainer + will merge it. Your contribution will be available from the next major release (e.g., 1.x) + unless explicitly backported to an existing or previous major release by the maintainer. + +#### Checklists + +Some common changes that many PRs require are documented through checklists as +`checklist-*.md` files in [docs/](../docs/), including: +- [Adding config fields](../docs/config/checklist-adding-config-fields.md) \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dd2f2ae1fe..fd85f397f6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,9 +3,9 @@ name: build on: push: # Sequence of patterns matched against refs/heads - branches: [ - "main" - ] + branches: + # Push events on the main branch + - main env: PKG_NAME: consul @@ -145,6 +145,7 @@ jobs: config_dir: ".release/linux/package" preinstall: ".release/linux/preinstall" postinstall: ".release/linux/postinstall" + preremove: ".release/linux/preremove" postremove: ".release/linux/postremove" - name: Set Package Names diff --git a/.release/ci.hcl b/.release/ci.hcl index b248590b83..bf4a2144f3 100644 --- a/.release/ci.hcl +++ b/.release/ci.hcl @@ -42,8 +42,36 @@ event "upload-dev" { } } -event "notarize-darwin-amd64" { +event "security-scan-binaries" { depends = ["upload-dev"] + action "security-scan-binaries" { + organization = "hashicorp" + repository = "crt-workflows-common" + workflow = "security-scan-binaries" + config = "security-scan.hcl" + } + + notification { + on = "fail" + } +} + +event "security-scan-containers" { + depends = ["security-scan-binaries"] + action "security-scan-containers" { + organization = "hashicorp" + repository = "crt-workflows-common" + workflow = "security-scan-containers" + config = "security-scan.hcl" + } + + notification { + on = "fail" + } +} + +event "notarize-darwin-amd64" { + depends = ["security-scan-containers"] action "notarize-darwin-amd64" { organization = "hashicorp" repository = "crt-workflows-common" diff --git a/.release/linux/postremove b/.release/linux/postremove index f317598216..b09bdfe60e 100644 --- a/.release/linux/postremove +++ b/.release/linux/postremove @@ -1,14 +1,19 @@ #!/bin/bash -if [ "$1" = "purge" ] -then - userdel consul +if [ -d "/run/systemd/system" ]; then + systemctl --system daemon-reload >/dev/null || : fi -if [ "$1" == "upgrade" ] && [ -d /run/systemd/system ]; then - systemctl --system daemon-reload >/dev/null || true - systemctl restart consul >/dev/null || true -fi +case "$1" in + purge | 0) + userdel consul + ;; -exit 0 + upgrade | [1-9]*) + if [ -d "/run/systemd/system" ]; then + systemctl try-restart consul.service >/dev/null || : + fi + ;; +esac +exit 0 diff --git a/.release/linux/preremove b/.release/linux/preremove new file mode 100644 index 0000000000..16fef7f3b4 --- /dev/null +++ b/.release/linux/preremove @@ -0,0 +1,11 @@ +#!/bin/bash +case "$1" in + remove | 0) + if [ -d "/run/systemd/system" ]; then + systemctl --no-reload disable consul.service > /dev/null || : + systemctl stop consul.service > /dev/null || : + fi + ;; +esac + +exit 0 diff --git a/.release/security-scan.hcl b/.release/security-scan.hcl new file mode 100644 index 0000000000..eeb188891c --- /dev/null +++ b/.release/security-scan.hcl @@ -0,0 +1,13 @@ +container { + dependencies = true + alpine_secdb = true + secrets = true +} + +binary { + secrets = true + go_modules = false + osv = true + oss_index = true + nvd = true +} diff --git a/Dockerfile b/Dockerfile index 3e365e117a..1bda4fccb9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # This Dockerfile contains multiple targets. # Use 'docker build --target= .' to build one. -# e.g. `docker build --target=dev .` +# e.g. `docker build --target=official .` # # All non-dev targets have a VERSION argument that must be provided # via --build-arg=VERSION= when building. @@ -191,4 +191,4 @@ ENTRYPOINT ["docker-entrypoint.sh"] # By default you'll get an insecure single-node development server that stores # everything in RAM, exposes a web UI and HTTP endpoints, and bootstraps itself. # Don't use this configuration for production. -CMD ["agent", "-dev", "-client", "0.0.0.0"] +CMD ["agent", "-dev", "-client", "0.0.0.0"] \ No newline at end of file diff --git a/GNUmakefile b/GNUmakefile index 311a47533f..b47d04dc4f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,3 +1,6 @@ +# For documentation on building consul from source, refer to: +# https://www.consul.io/docs/install#compiling-from-source + SHELL = bash GOGOVERSION?=$(shell grep github.com/gogo/protobuf go.mod | awk '{print $$2}') GOTOOLS = \ @@ -12,8 +15,6 @@ GOTOOLS = \ github.com/hashicorp/lint-consul-retry@master GOTAGS ?= -GOOS?=$(shell go env GOOS) -GOARCH?=$(shell go env GOARCH) GOPATH=$(shell go env GOPATH) MAIN_GOPATH=$(shell go env GOPATH | cut -d: -f1) @@ -134,20 +135,17 @@ ifdef SKIP_DOCKER_BUILD ENVOY_INTEG_DEPS=noop endif -# all builds binaries for all targets -all: bin +all: dev-build # used to make integration dependencies conditional noop: ; -bin: tools - @$(SHELL) $(CURDIR)/build-support/scripts/build-local.sh - -# dev creates binaries for testing locally - these are put into ./bin and $GOPATH +# dev creates binaries for testing locally - these are put into ./bin dev: dev-build dev-build: - @$(SHELL) $(CURDIR)/build-support/scripts/build-local.sh -o $(GOOS) -a $(GOARCH) + mkdir -p bin + CGO_ENABLED=0 go build -o ./bin -ldflags "$(GOLDFLAGS)" -tags "$(GOTAGS)" dev-docker: linux @echo "Pulling consul container image - $(CONSUL_IMAGE_VERSION)" @@ -175,9 +173,10 @@ ifeq ($(CIRCLE_BRANCH), main) @docker push $(CI_DEV_DOCKER_NAMESPACE)/$(CI_DEV_DOCKER_IMAGE_NAME):latest endif -# linux builds a linux package independent of the source platform +# linux builds a linux binary independent of the source platform linux: - @$(SHELL) $(CURDIR)/build-support/scripts/build-local.sh -o linux -a amd64 + mkdir -p bin + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin -ldflags "$(GOLDFLAGS)" -tags "$(GOTAGS)" # dist builds binaries for all platforms and packages them for distribution dist: diff --git a/README.md b/README.md index 155f504952..695b0707fd 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,20 @@ -# Consul [![CircleCI](https://circleci.com/gh/hashicorp/consul/tree/main.svg?style=svg)](https://circleci.com/gh/hashicorp/consul/tree/main) [![Discuss](https://img.shields.io/badge/discuss-consul-ca2171.svg?style=flat)](https://discuss.hashicorp.com/c/consul) +# Consul + +

+ + HashiCorp Consul logo + +

+ +[![Docker Pulls](https://img.shields.io/docker/pulls/_/consul.svg)](https://hub.docker.com/_/consul) +[![Go Report Card](https://goreportcard.com/badge/github.com/hashicorp/consul)](https://goreportcard.com/report/github.com/hashicorp/consul) + +Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure. * Website: https://www.consul.io * Tutorials: [HashiCorp Learn](https://learn.hashicorp.com/consul) * Forum: [Discuss](https://discuss.hashicorp.com/c/consul) -Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure. - Consul provides several key features: * **Multi-Datacenter** - Consul is built to be datacenter aware, and can diff --git a/agent/acl.go b/agent/acl.go index fa2259cfd3..0c0334a2f0 100644 --- a/agent/acl.go +++ b/agent/acl.go @@ -15,7 +15,7 @@ import ( // critical purposes, such as logging. Therefore we interpret all errors as empty-string // so we can safely log it without handling non-critical errors at the usage site. func (a *Agent) aclAccessorID(secretID string) string { - ident, err := a.delegate.ResolveTokenToIdentity(secretID) + ident, err := a.delegate.ResolveTokenAndDefaultMeta(secretID, nil, nil) if acl.IsErrNotFound(err) { return "" } @@ -23,10 +23,7 @@ func (a *Agent) aclAccessorID(secretID string) string { a.logger.Debug("non-critical error resolving acl token accessor for logging", "error", err) return "" } - if ident == nil { - return "" - } - return ident.ID() + return ident.AccessorID() } // vetServiceRegister makes sure the service registration action is allowed by @@ -174,7 +171,7 @@ func (a *Agent) filterMembers(token string, members *[]serf.Member) error { if authz.NodeRead(node, &authzContext) == acl.Allow { continue } - accessorID := a.aclAccessorID(token) + accessorID := authz.AccessorID() a.logger.Debug("dropping node from result due to ACLs", "node", node, "accessorID", accessorID) m = append(m[:i], m[i+1:]...) i-- diff --git a/agent/acl_test.go b/agent/acl_test.go index c085e49a39..ad7e8cebbb 100644 --- a/agent/acl_test.go +++ b/agent/acl_test.go @@ -39,6 +39,12 @@ type TestACLAgent struct { func NewTestACLAgent(t *testing.T, name string, hcl string, resolveAuthz authzResolver, resolveIdent identResolver) *TestACLAgent { t.Helper() + if resolveIdent == nil { + resolveIdent = func(s string) (structs.ACLIdentity, error) { + return nil, nil + } + } + a := &TestACLAgent{resolveAuthzFn: resolveAuthz, resolveIdentFn: resolveIdent} dataDir := testutil.TempDir(t, "acl-agent") @@ -86,26 +92,15 @@ func (a *TestACLAgent) ResolveToken(secretID string) (acl.Authorizer, error) { return authz, err } -func (a *TestACLAgent) ResolveTokenToIdentityAndAuthorizer(secretID string) (structs.ACLIdentity, acl.Authorizer, error) { - if a.resolveAuthzFn == nil { - return nil, nil, fmt.Errorf("ResolveTokenToIdentityAndAuthorizer call is unexpected - no authz resolver callback set") - } - - return a.resolveAuthzFn(secretID) -} - -func (a *TestACLAgent) ResolveTokenToIdentity(secretID string) (structs.ACLIdentity, error) { - if a.resolveIdentFn == nil { - return nil, fmt.Errorf("ResolveTokenToIdentity call is unexpected - no ident resolver callback set") +func (a *TestACLAgent) ResolveTokenAndDefaultMeta(secretID string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (consul.ACLResolveResult, error) { + authz, err := a.ResolveToken(secretID) + if err != nil { + return consul.ACLResolveResult{}, err } - return a.resolveIdentFn(secretID) -} - -func (a *TestACLAgent) ResolveTokenAndDefaultMeta(secretID string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (acl.Authorizer, error) { - identity, authz, err := a.ResolveTokenToIdentityAndAuthorizer(secretID) + identity, err := a.resolveIdentFn(secretID) if err != nil { - return nil, err + return consul.ACLResolveResult{}, err } // Default the EnterpriseMeta based on the Tokens meta or actual defaults @@ -119,7 +114,7 @@ func (a *TestACLAgent) ResolveTokenAndDefaultMeta(secretID string, entMeta *stru // Use the meta to fill in the ACL authorization context entMeta.FillAuthzContext(authzContext) - return authz, err + return consul.ACLResolveResult{Authorizer: authz, ACLIdentity: identity}, err } // All of these are stubs to satisfy the interface @@ -523,22 +518,3 @@ func TestACL_filterChecksWithAuthorizer(t *testing.T) { _, ok = checks["my-other"] require.False(t, ok) } - -// TODO: remove? -func TestACL_ResolveIdentity(t *testing.T) { - t.Parallel() - a := NewTestACLAgent(t, t.Name(), TestACLConfig(), nil, catalogIdent) - - // this test is meant to ensure we are calling the correct function - // which is ResolveTokenToIdentity on the Agent delegate. Our - // nil authz resolver will cause it to emit an error if used - ident, err := a.delegate.ResolveTokenToIdentity(nodeROSecret) - require.NoError(t, err) - require.NotNil(t, ident) - - // just double checkingto ensure if we had used the wrong function - // that an error would be produced - _, err = a.delegate.ResolveTokenAndDefaultMeta(nodeROSecret, nil, nil) - require.Error(t, err) - -} diff --git a/agent/agent.go b/agent/agent.go index 41bab89e7f..7e2a7f110a 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -167,14 +167,11 @@ type delegate interface { // RemoveFailedNode is used to remove a failed node from the cluster. RemoveFailedNode(node string, prune bool, entMeta *structs.EnterpriseMeta) error - // TODO: replace this method with consul.ACLResolver - ResolveTokenToIdentity(token string) (structs.ACLIdentity, error) - // ResolveTokenAndDefaultMeta returns an acl.Authorizer which authorizes // actions based on the permissions granted to the token. // If either entMeta or authzContext are non-nil they will be populated with the // default partition and namespace from the token. - ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (acl.Authorizer, error) + ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (consul.ACLResolveResult, error) RPC(method string, args interface{}, reply interface{}) error SnapshotRPC(args *structs.SnapshotRequest, in io.Reader, out io.Writer, replyFn structs.SnapshotReplyFn) error diff --git a/agent/agent_endpoint_test.go b/agent/agent_endpoint_test.go index 8e965db38e..70840f9502 100644 --- a/agent/agent_endpoint_test.go +++ b/agent/agent_endpoint_test.go @@ -1640,8 +1640,8 @@ type fakeResolveTokenDelegate struct { authorizer acl.Authorizer } -func (f fakeResolveTokenDelegate) ResolveTokenAndDefaultMeta(_ string, _ *structs.EnterpriseMeta, _ *acl.AuthorizerContext) (acl.Authorizer, error) { - return f.authorizer, nil +func (f fakeResolveTokenDelegate) ResolveTokenAndDefaultMeta(_ string, _ *structs.EnterpriseMeta, _ *acl.AuthorizerContext) (consul.ACLResolveResult, error) { + return consul.ACLResolveResult{Authorizer: f.authorizer}, nil } func TestAgent_Reload(t *testing.T) { diff --git a/agent/catalog_endpoint.go b/agent/catalog_endpoint.go index 8443e31f3e..2ae1b07dc0 100644 --- a/agent/catalog_endpoint.go +++ b/agent/catalog_endpoint.go @@ -136,9 +136,7 @@ func (s *HTTPHandlers) CatalogRegister(resp http.ResponseWriter, req *http.Reque } if err := s.rewordUnknownEnterpriseFieldError(decodeBody(req.Body, &args)); err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Request decode failed: %v", err) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Request decode failed: %v", err)} } // Setup the default DC if not provided @@ -168,9 +166,7 @@ func (s *HTTPHandlers) CatalogDeregister(resp http.ResponseWriter, req *http.Req return nil, err } if err := s.rewordUnknownEnterpriseFieldError(decodeBody(req.Body, &args)); err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Request decode failed: %v", err) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Request decode failed: %v", err)} } // Setup the default DC if not provided @@ -367,9 +363,7 @@ func (s *HTTPHandlers) catalogServiceNodes(resp http.ResponseWriter, req *http.R return nil, err } if args.ServiceName == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing service name") - return nil, nil + return nil, BadRequestError{Reason: "Missing service name"} } // Make the RPC request @@ -444,9 +438,7 @@ func (s *HTTPHandlers) CatalogNodeServices(resp http.ResponseWriter, req *http.R return nil, err } if args.Node == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing node name") - return nil, nil + return nil, BadRequestError{Reason: "Missing node name"} } // Make the RPC request @@ -511,9 +503,7 @@ func (s *HTTPHandlers) CatalogNodeServiceList(resp http.ResponseWriter, req *htt return nil, err } if args.Node == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing node name") - return nil, nil + return nil, BadRequestError{Reason: "Missing node name"} } // Make the RPC request @@ -564,9 +554,7 @@ func (s *HTTPHandlers) CatalogGatewayServices(resp http.ResponseWriter, req *htt return nil, err } if args.ServiceName == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing gateway name") - return nil, nil + return nil, BadRequestError{Reason: "Missing gateway name"} } // Make the RPC request diff --git a/agent/config_endpoint.go b/agent/config_endpoint.go index 9f916624ef..4bd96d4363 100644 --- a/agent/config_endpoint.go +++ b/agent/config_endpoint.go @@ -90,16 +90,12 @@ func (s *HTTPHandlers) configDelete(resp http.ResponseWriter, req *http.Request) pathArgs := strings.SplitN(kindAndName, "/", 2) if len(pathArgs) != 2 { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprintf(resp, "Must provide both a kind and name to delete") - return nil, nil + return nil, NotFoundError{Reason: "Must provide both a kind and name to delete"} } entry, err := structs.MakeConfigEntry(pathArgs[0], pathArgs[1]) if err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "%v", err) - return nil, nil + return nil, BadRequestError{Reason: err.Error()} } args.Entry = entry // Parse enterprise meta. diff --git a/agent/connect/ca/provider_vault.go b/agent/connect/ca/provider_vault.go index 3a1d5128e7..d837fe1a85 100644 --- a/agent/connect/ca/provider_vault.go +++ b/agent/connect/ca/provider_vault.go @@ -16,10 +16,9 @@ import ( vaultapi "github.com/hashicorp/vault/api" "github.com/mitchellh/mapstructure" - "github.com/hashicorp/consul/lib/decode" - "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/lib/decode" ) const ( @@ -161,6 +160,34 @@ func (v *VaultProvider) Configure(cfg ProviderConfig) error { return nil } +func (v *VaultProvider) ValidateConfigUpdate(prevRaw, nextRaw map[string]interface{}) error { + prev, err := ParseVaultCAConfig(prevRaw) + if err != nil { + return fmt.Errorf("failed to parse existing CA config: %w", err) + } + next, err := ParseVaultCAConfig(nextRaw) + if err != nil { + return fmt.Errorf("failed to parse new CA config: %w", err) + } + + if prev.RootPKIPath != next.RootPKIPath { + return nil + } + + if prev.PrivateKeyType != "" && prev.PrivateKeyType != connect.DefaultPrivateKeyType { + if prev.PrivateKeyType != next.PrivateKeyType { + return fmt.Errorf("cannot update the PrivateKeyType field without changing RootPKIPath") + } + } + + if prev.PrivateKeyBits != 0 && prev.PrivateKeyBits != connect.DefaultPrivateKeyBits { + if prev.PrivateKeyBits != next.PrivateKeyBits { + return fmt.Errorf("cannot update the PrivateKeyBits field without changing RootPKIPath") + } + } + return nil +} + // renewToken uses a vaultapi.LifetimeWatcher to repeatedly renew our token's lease. // If the token can no longer be renewed and auth method is set, // it will re-authenticate to Vault using the auth method and restart the renewer with the new token. @@ -273,31 +300,6 @@ func (v *VaultProvider) GenerateRoot() (RootResult, error) { if err != nil { return RootResult{}, err } - - if rootPEM != "" { - rootCert, err := connect.ParseCert(rootPEM) - if err != nil { - return RootResult{}, err - } - - // Vault PKI doesn't allow in-place cert/key regeneration. That - // means if you need to change either the key type or key bits then - // you also need to provide new mount points. - // https://www.vaultproject.io/api-docs/secret/pki#generate-root - // - // A separate bug in vault likely also requires that you use the - // ForceWithoutCrossSigning option when changing key types. - foundKeyType, foundKeyBits, err := connect.KeyInfoFromCert(rootCert) - if err != nil { - return RootResult{}, err - } - if v.config.PrivateKeyType != foundKeyType { - return RootResult{}, fmt.Errorf("cannot update the PrivateKeyType field without choosing a new PKI mount for the root CA") - } - if v.config.PrivateKeyBits != foundKeyBits { - return RootResult{}, fmt.Errorf("cannot update the PrivateKeyBits field without choosing a new PKI mount for the root CA") - } - } } return RootResult{PEM: rootPEM}, nil @@ -400,17 +402,14 @@ func (v *VaultProvider) SetIntermediate(intermediatePEM, rootPEM string) error { return fmt.Errorf("cannot set an intermediate using another root in the primary datacenter") } - err := validateSetIntermediate( - intermediatePEM, rootPEM, - "", // we don't have access to the private key directly - v.spiffeID, - ) + // the private key is in vault, so we can't use it in this validation + err := validateSetIntermediate(intermediatePEM, rootPEM, "", v.spiffeID) if err != nil { return err } _, err = v.client.Logical().Write(v.config.IntermediatePKIPath+"intermediate/set-signed", map[string]interface{}{ - "certificate": fmt.Sprintf("%s\n%s", intermediatePEM, rootPEM), + "certificate": intermediatePEM, }) if err != nil { return err diff --git a/agent/consul/acl.go b/agent/consul/acl.go index ee0a1704ef..350f9993b6 100644 --- a/agent/consul/acl.go +++ b/agent/consul/acl.go @@ -34,10 +34,6 @@ var ACLSummaries = []prometheus.SummaryDefinition{ Name: []string{"acl", "ResolveToken"}, Help: "This measures the time it takes to resolve an ACL token.", }, - { - Name: []string{"acl", "ResolveTokenToIdentity"}, - Help: "This measures the time it takes to resolve an ACL token to an Identity.", - }, } // These must be kept in sync with the constants in command/agent/acl.go. @@ -1057,13 +1053,16 @@ func (r *ACLResolver) resolveLocallyManagedToken(token string) (structs.ACLIdent return r.resolveLocallyManagedEnterpriseToken(token) } -func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs.ACLIdentity, acl.Authorizer, error) { +// ResolveToken to an acl.Authorizer and structs.ACLIdentity. The acl.Authorizer +// can be used to check permissions granted to the token, and the ACLIdentity +// describes the token and any defaults applied to it. +func (r *ACLResolver) ResolveToken(token string) (ACLResolveResult, error) { if !r.ACLsEnabled() { - return nil, acl.ManageAll(), nil + return ACLResolveResult{Authorizer: acl.ManageAll()}, nil } if acl.RootAuthorizer(token) != nil { - return nil, nil, acl.ErrRootDenied + return ACLResolveResult{}, acl.ErrRootDenied } // handle the anonymous token @@ -1072,7 +1071,7 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs } if ident, authz, ok := r.resolveLocallyManagedToken(token); ok { - return ident, authz, nil + return ACLResolveResult{Authorizer: authz, ACLIdentity: ident}, nil } defer metrics.MeasureSince([]string{"acl", "ResolveToken"}, time.Now()) @@ -1082,10 +1081,11 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs r.handleACLDisabledError(err) if IsACLRemoteError(err) { r.logger.Error("Error resolving token", "error", err) - return &missingIdentity{reason: "primary-dc-down", token: token}, r.down, nil + ident := &missingIdentity{reason: "primary-dc-down", token: token} + return ACLResolveResult{Authorizer: r.down, ACLIdentity: ident}, nil } - return nil, nil, err + return ACLResolveResult{}, err } // Build the Authorizer @@ -1098,7 +1098,7 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs authz, err := policies.Compile(r.cache, &conf) if err != nil { - return nil, nil, err + return ACLResolveResult{}, err } chain = append(chain, authz) @@ -1106,42 +1106,32 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs if err != nil { if IsACLRemoteError(err) { r.logger.Error("Error resolving identity defaults", "error", err) - return identity, r.down, nil + return ACLResolveResult{Authorizer: r.down, ACLIdentity: identity}, nil } - return nil, nil, err + return ACLResolveResult{}, err } else if authz != nil { chain = append(chain, authz) } chain = append(chain, acl.RootAuthorizer(r.config.ACLDefaultPolicy)) - return identity, acl.NewChainedAuthorizer(chain), nil + return ACLResolveResult{Authorizer: acl.NewChainedAuthorizer(chain), ACLIdentity: identity}, nil } -// TODO: rename to AccessorIDFromToken. This method is only used to retrieve the -// ACLIdentity.ID, so we don't need to return a full ACLIdentity. We could -// return a much smaller type (instad of just a string) to allow for changes -// in the future. -func (r *ACLResolver) ResolveTokenToIdentity(token string) (structs.ACLIdentity, error) { - if !r.ACLsEnabled() { - return nil, nil - } - - if acl.RootAuthorizer(token) != nil { - return nil, acl.ErrRootDenied - } - - // handle the anonymous token - if token == "" { - token = anonymousToken - } +type ACLResolveResult struct { + acl.Authorizer + // TODO: likely we can reduce this interface + ACLIdentity structs.ACLIdentity +} - if ident, _, ok := r.resolveLocallyManagedToken(token); ok { - return ident, nil +func (a ACLResolveResult) AccessorID() string { + if a.ACLIdentity == nil { + return "" } + return a.ACLIdentity.ID() +} - defer metrics.MeasureSince([]string{"acl", "ResolveTokenToIdentity"}, time.Now()) - - return r.resolveIdentityFromToken(token) +func (a ACLResolveResult) Identity() structs.ACLIdentity { + return a.ACLIdentity } func (r *ACLResolver) ACLsEnabled() bool { @@ -1160,6 +1150,30 @@ func (r *ACLResolver) ACLsEnabled() bool { return true } +func (r *ACLResolver) ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (ACLResolveResult, error) { + result, err := r.ResolveToken(token) + if err != nil { + return ACLResolveResult{}, err + } + + if entMeta == nil { + entMeta = &structs.EnterpriseMeta{} + } + + // Default the EnterpriseMeta based on the Tokens meta or actual defaults + // in the case of unknown identity + if result.ACLIdentity != nil { + entMeta.Merge(result.ACLIdentity.EnterpriseMetadata()) + } else { + entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition()) + } + + // Use the meta to fill in the ACL authorization context + entMeta.FillAuthzContext(authzContext) + + return result, err +} + // aclFilter is used to filter results from our state store based on ACL rules // configured for the provided token. type aclFilter struct { @@ -1967,7 +1981,7 @@ func filterACLWithAuthorizer(logger hclog.Logger, authorizer acl.Authorizer, sub // not authorized for read access will be removed from subj. func filterACL(r *ACLResolver, token string, subj interface{}) error { // Get the ACL from the token - _, authorizer, err := r.ResolveTokenToIdentityAndAuthorizer(token) + authorizer, err := r.ResolveToken(token) if err != nil { return err } diff --git a/agent/consul/acl_client.go b/agent/consul/acl_client.go index 2378776c83..1cd287cf67 100644 --- a/agent/consul/acl_client.go +++ b/agent/consul/acl_client.go @@ -1,7 +1,6 @@ package consul import ( - "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" ) @@ -48,35 +47,3 @@ func (c *clientACLResolverBackend) ResolveRoleFromID(roleID string) (bool, *stru // clients do no local role resolution at the moment return false, nil, nil } - -func (c *Client) ResolveTokenToIdentity(token string) (structs.ACLIdentity, error) { - // not using ResolveTokenToIdentityAndAuthorizer because in this case we don't - // need to resolve the roles, policies and namespace but just want the identity - // information such as accessor id. - return c.acls.ResolveTokenToIdentity(token) -} - -// TODO: Server has an identical implementation, remove duplication -func (c *Client) ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (acl.Authorizer, error) { - identity, authz, err := c.acls.ResolveTokenToIdentityAndAuthorizer(token) - if err != nil { - return nil, err - } - - if entMeta == nil { - entMeta = &structs.EnterpriseMeta{} - } - - // Default the EnterpriseMeta based on the Tokens meta or actual defaults - // in the case of unknown identity - if identity != nil { - entMeta.Merge(identity.EnterpriseMetadata()) - } else { - entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition()) - } - - // Use the meta to fill in the ACL authorization context - entMeta.FillAuthzContext(authzContext) - - return authz, err -} diff --git a/agent/consul/acl_endpoint.go b/agent/consul/acl_endpoint.go index 376278c835..13799c3182 100644 --- a/agent/consul/acl_endpoint.go +++ b/agent/consul/acl_endpoint.go @@ -724,7 +724,7 @@ func (a *ACL) tokenSetInternal(args *structs.ACLTokenSetRequest, reply *structs. } // Purge the identity from the cache to prevent using the previous definition of the identity - a.srv.acls.cache.RemoveIdentity(tokenSecretCacheID(token.SecretID)) + a.srv.ACLResolver.cache.RemoveIdentity(tokenSecretCacheID(token.SecretID)) // Don't check expiration times here as it doesn't really matter. if _, updatedToken, err := a.srv.fsm.State().ACLTokenGetByAccessor(nil, token.AccessorID, nil); err == nil && updatedToken != nil { @@ -876,7 +876,7 @@ func (a *ACL) TokenDelete(args *structs.ACLTokenDeleteRequest, reply *string) er } // Purge the identity from the cache to prevent using the previous definition of the identity - a.srv.acls.cache.RemoveIdentity(tokenSecretCacheID(token.SecretID)) + a.srv.ACLResolver.cache.RemoveIdentity(tokenSecretCacheID(token.SecretID)) if reply != nil { *reply = token.AccessorID @@ -1198,7 +1198,7 @@ func (a *ACL) PolicySet(args *structs.ACLPolicySetRequest, reply *structs.ACLPol } // Remove from the cache to prevent stale cache usage - a.srv.acls.cache.RemovePolicy(policy.ID) + a.srv.ACLResolver.cache.RemovePolicy(policy.ID) if _, policy, err := a.srv.fsm.State().ACLPolicyGetByID(nil, policy.ID, &policy.EnterpriseMeta); err == nil && policy != nil { *reply = *policy @@ -1257,7 +1257,7 @@ func (a *ACL) PolicyDelete(args *structs.ACLPolicyDeleteRequest, reply *string) return fmt.Errorf("Failed to apply policy delete request: %v", err) } - a.srv.acls.cache.RemovePolicy(policy.ID) + a.srv.ACLResolver.cache.RemovePolicy(policy.ID) *reply = policy.Name @@ -1318,12 +1318,12 @@ func (a *ACL) PolicyResolve(args *structs.ACLPolicyBatchGetRequest, reply *struc } // get full list of policies for this token - identity, policies, err := a.srv.acls.resolveTokenToIdentityAndPolicies(args.Token) + identity, policies, err := a.srv.ACLResolver.resolveTokenToIdentityAndPolicies(args.Token) if err != nil { return err } - entIdentity, entPolicies, err := a.srv.acls.resolveEnterpriseIdentityAndPolicies(identity) + entIdentity, entPolicies, err := a.srv.ACLResolver.resolveEnterpriseIdentityAndPolicies(identity) if err != nil { return err } @@ -1609,7 +1609,7 @@ func (a *ACL) RoleSet(args *structs.ACLRoleSetRequest, reply *structs.ACLRole) e } // Remove from the cache to prevent stale cache usage - a.srv.acls.cache.RemoveRole(role.ID) + a.srv.ACLResolver.cache.RemoveRole(role.ID) if _, role, err := a.srv.fsm.State().ACLRoleGetByID(nil, role.ID, &role.EnterpriseMeta); err == nil && role != nil { *reply = *role @@ -1664,7 +1664,7 @@ func (a *ACL) RoleDelete(args *structs.ACLRoleDeleteRequest, reply *string) erro return fmt.Errorf("Failed to apply role delete request: %v", err) } - a.srv.acls.cache.RemoveRole(role.ID) + a.srv.ACLResolver.cache.RemoveRole(role.ID) *reply = role.Name @@ -1719,12 +1719,12 @@ func (a *ACL) RoleResolve(args *structs.ACLRoleBatchGetRequest, reply *structs.A } // get full list of roles for this token - identity, roles, err := a.srv.acls.resolveTokenToIdentityAndRoles(args.Token) + identity, roles, err := a.srv.ACLResolver.resolveTokenToIdentityAndRoles(args.Token) if err != nil { return err } - entIdentity, entRoles, err := a.srv.acls.resolveEnterpriseIdentityAndRoles(identity) + entIdentity, entRoles, err := a.srv.ACLResolver.resolveEnterpriseIdentityAndRoles(identity) if err != nil { return err } @@ -2481,7 +2481,7 @@ func (a *ACL) Logout(args *structs.ACLLogoutRequest, reply *bool) error { } // Purge the identity from the cache to prevent using the previous definition of the identity - a.srv.acls.cache.RemoveIdentity(tokenSecretCacheID(token.SecretID)) + a.srv.ACLResolver.cache.RemoveIdentity(tokenSecretCacheID(token.SecretID)) *reply = true diff --git a/agent/consul/acl_server.go b/agent/consul/acl_server.go index 497b347d73..ba44b5606c 100644 --- a/agent/consul/acl_server.go +++ b/agent/consul/acl_server.go @@ -165,47 +165,10 @@ func (s *serverACLResolverBackend) ResolveRoleFromID(roleID string) (bool, *stru return s.InPrimaryDatacenter() || index > 0, role, acl.ErrNotFound } -func (s *Server) ResolveToken(token string) (acl.Authorizer, error) { - _, authz, err := s.acls.ResolveTokenToIdentityAndAuthorizer(token) - return authz, err -} - -func (s *Server) ResolveTokenToIdentity(token string) (structs.ACLIdentity, error) { - // not using ResolveTokenToIdentityAndAuthorizer because in this case we don't - // need to resolve the roles, policies and namespace but just want the identity - // information such as accessor id. - return s.acls.ResolveTokenToIdentity(token) -} - -// TODO: Client has an identical implementation, remove duplication -func (s *Server) ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (acl.Authorizer, error) { - identity, authz, err := s.acls.ResolveTokenToIdentityAndAuthorizer(token) - if err != nil { - return nil, err - } - - if entMeta == nil { - entMeta = &structs.EnterpriseMeta{} - } - - // Default the EnterpriseMeta based on the Tokens meta or actual defaults - // in the case of unknown identity - if identity != nil { - entMeta.Merge(identity.EnterpriseMetadata()) - } else { - entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition()) - } - - // Use the meta to fill in the ACL authorization context - entMeta.FillAuthzContext(authzContext) - - return authz, err -} - func (s *Server) filterACL(token string, subj interface{}) error { - return filterACL(s.acls, token, subj) + return filterACL(s.ACLResolver, token, subj) } func (s *Server) filterACLWithAuthorizer(authorizer acl.Authorizer, subj interface{}) { - filterACLWithAuthorizer(s.acls.logger, authorizer, subj) + filterACLWithAuthorizer(s.ACLResolver.logger, authorizer, subj) } diff --git a/agent/consul/acl_test.go b/agent/consul/acl_test.go index ee328039bf..d453d50a01 100644 --- a/agent/consul/acl_test.go +++ b/agent/consul/acl_test.go @@ -46,10 +46,11 @@ type asyncResolutionResult struct { err error } -func verifyAuthorizerChain(t *testing.T, expected acl.Authorizer, actual acl.Authorizer) { - expectedChainAuthz, ok := expected.(*acl.ChainedAuthorizer) +func verifyAuthorizerChain(t *testing.T, expected ACLResolveResult, actual ACLResolveResult) { + t.Helper() + expectedChainAuthz, ok := expected.Authorizer.(*acl.ChainedAuthorizer) require.True(t, ok, "expected Authorizer is not a ChainedAuthorizer") - actualChainAuthz, ok := actual.(*acl.ChainedAuthorizer) + actualChainAuthz, ok := actual.Authorizer.(*acl.ChainedAuthorizer) require.True(t, ok, "actual Authorizer is not a ChainedAuthorizer") expectedChain := expectedChainAuthz.AuthorizerChain() @@ -65,19 +66,13 @@ func verifyAuthorizerChain(t *testing.T, expected acl.Authorizer, actual acl.Aut } func resolveTokenAsync(r *ACLResolver, token string, ch chan *asyncResolutionResult) { - _, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token) + authz, err := r.ResolveToken(token) ch <- &asyncResolutionResult{authz: authz, err: err} } -// Deprecated: use resolveToken or ACLResolver.ResolveTokenToIdentityAndAuthorizer instead -func (r *ACLResolver) ResolveToken(token string) (acl.Authorizer, error) { - _, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token) - return authz, err -} - func resolveToken(t *testing.T, r *ACLResolver, token string) acl.Authorizer { t.Helper() - _, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token) + authz, err := r.ResolveToken(token) require.NoError(t, err) return authz } @@ -739,7 +734,7 @@ func TestACLResolver_Disabled(t *testing.T) { r := newTestACLResolver(t, delegate, nil) authz, err := r.ResolveToken("does not exist") - require.Equal(t, acl.ManageAll(), authz) + require.Equal(t, ACLResolveResult{Authorizer: acl.ManageAll()}, authz) require.Nil(t, err) } @@ -753,22 +748,19 @@ func TestACLResolver_ResolveRootACL(t *testing.T) { r := newTestACLResolver(t, delegate, nil) t.Run("Allow", func(t *testing.T) { - authz, err := r.ResolveToken("allow") - require.Nil(t, authz) + _, err := r.ResolveToken("allow") require.Error(t, err) require.True(t, acl.IsErrRootDenied(err)) }) t.Run("Deny", func(t *testing.T) { - authz, err := r.ResolveToken("deny") - require.Nil(t, authz) + _, err := r.ResolveToken("deny") require.Error(t, err) require.True(t, acl.IsErrRootDenied(err)) }) t.Run("Manage", func(t *testing.T) { - authz, err := r.ResolveToken("manage") - require.Nil(t, authz) + _, err := r.ResolveToken("manage") require.Error(t, err) require.True(t, acl.IsErrRootDenied(err)) }) @@ -817,7 +809,11 @@ func TestACLResolver_DownPolicy(t *testing.T) { authz, err := r.ResolveToken("foo") require.NoError(t, err) require.NotNil(t, authz) - require.Equal(t, authz, acl.DenyAll()) + expected := ACLResolveResult{ + Authorizer: acl.DenyAll(), + ACLIdentity: &missingIdentity{reason: "primary-dc-down", token: "foo"}, + } + require.Equal(t, expected, authz) requireIdentityCached(t, r, tokenSecretCacheID("foo"), false, "not present") }) @@ -841,7 +837,11 @@ func TestACLResolver_DownPolicy(t *testing.T) { authz, err := r.ResolveToken("foo") require.NoError(t, err) require.NotNil(t, authz) - require.Equal(t, authz, acl.AllowAll()) + expected := ACLResolveResult{ + Authorizer: acl.AllowAll(), + ACLIdentity: &missingIdentity{reason: "primary-dc-down", token: "foo"}, + } + require.Equal(t, expected, authz) requireIdentityCached(t, r, tokenSecretCacheID("foo"), false, "not present") }) @@ -958,7 +958,7 @@ func TestACLResolver_DownPolicy(t *testing.T) { config.Config.ACLDownPolicy = "extend-cache" }) - _, authz, err := r.ResolveTokenToIdentityAndAuthorizer("not-found") + authz, err := r.ResolveToken("not-found") require.NoError(t, err) require.NotNil(t, authz) require.Equal(t, acl.Deny, authz.NodeWrite("foo", nil)) @@ -1255,10 +1255,9 @@ func TestACLResolver_DownPolicy(t *testing.T) { // the go routine spawned will eventually return and this will be a not found error retry.Run(t, func(t *retry.R) { - authz3, err := r.ResolveToken("found") + _, err := r.ResolveToken("found") assert.Error(t, err) assert.True(t, acl.IsErrNotFound(err)) - assert.Nil(t, authz3) }) requireIdentityCached(t, r, tokenSecretCacheID("found"), false, "no longer cached") @@ -1526,7 +1525,6 @@ func TestACLResolver_Client(t *testing.T) { // policies within the cache) authz, err = r.ResolveToken("a1a54629-5050-4d17-8a4e-560d2423f835") require.EqualError(t, err, acl.ErrNotFound.Error()) - require.Nil(t, authz) require.True(t, modified) require.True(t, deleted) @@ -1534,36 +1532,6 @@ func TestACLResolver_Client(t *testing.T) { require.Equal(t, policyResolves, int32(3)) }) - t.Run("Resolve-Identity", func(t *testing.T) { - t.Parallel() - - delegate := &ACLResolverTestDelegate{ - enabled: true, - datacenter: "dc1", - legacy: false, - localTokens: false, - localPolicies: false, - } - - delegate.tokenReadFn = delegate.plainTokenReadFn - delegate.policyResolveFn = delegate.plainPolicyResolveFn - delegate.roleResolveFn = delegate.plainRoleResolveFn - - r := newTestACLResolver(t, delegate, nil) - - ident, err := r.ResolveTokenToIdentity("found-policy-and-role") - require.NoError(t, err) - require.NotNil(t, ident) - require.Equal(t, "5f57c1f6-6a89-4186-9445-531b316e01df", ident.ID()) - require.EqualValues(t, 0, delegate.localTokenResolutions) - require.EqualValues(t, 1, delegate.remoteTokenResolutions) - require.EqualValues(t, 0, delegate.localPolicyResolutions) - require.EqualValues(t, 0, delegate.remotePolicyResolutions) - require.EqualValues(t, 0, delegate.localRoleResolutions) - require.EqualValues(t, 0, delegate.remoteRoleResolutions) - require.EqualValues(t, 0, delegate.remoteLegacyResolutions) - }) - t.Run("Concurrent-Token-Resolve", func(t *testing.T) { t.Parallel() @@ -1705,8 +1673,7 @@ func testACLResolver_variousTokens(t *testing.T, delegate *ACLResolverTestDelega runTwiceAndReset("Missing Identity", func(t *testing.T) { delegate.UseTestLocalData(nil) - authz, err := r.ResolveToken("doesn't exist") - require.Nil(t, authz) + _, err := r.ResolveToken("doesn't exist") require.Error(t, err) require.True(t, acl.IsErrNotFound(err)) }) @@ -3959,12 +3926,12 @@ func TestACLResolver_AgentRecovery(t *testing.T) { tokens.UpdateAgentRecoveryToken("9a184a11-5599-459e-b71a-550e5f9a5a23", token.TokenSourceConfig) - ident, authz, err := r.ResolveTokenToIdentityAndAuthorizer("9a184a11-5599-459e-b71a-550e5f9a5a23") + authz, err := r.ResolveToken("9a184a11-5599-459e-b71a-550e5f9a5a23") require.NoError(t, err) - require.NotNil(t, ident) - require.Equal(t, "agent-recovery:foo", ident.ID()) - require.NotNil(t, authz) - require.Equal(t, r.agentRecoveryAuthz, authz) + require.NotNil(t, authz.ACLIdentity) + require.Equal(t, "agent-recovery:foo", authz.ACLIdentity.ID()) + require.NotNil(t, authz.Authorizer) + require.Equal(t, r.agentRecoveryAuthz, authz.Authorizer) require.Equal(t, acl.Allow, authz.AgentWrite("foo", nil)) require.Equal(t, acl.Allow, authz.NodeRead("bar", nil)) require.Equal(t, acl.Deny, authz.NodeWrite("bar", nil)) @@ -4028,7 +3995,7 @@ func TestACLResolver_ACLsEnabled(t *testing.T) { } -func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t *testing.T) { +func TestACLResolver_ResolveToken_UpdatesPurgeTheCache(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") } @@ -4065,7 +4032,7 @@ func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t require.NoError(t, err) runStep(t, "first resolve", func(t *testing.T) { - _, authz, err := srv.acls.ResolveTokenToIdentityAndAuthorizer(token) + authz, err := srv.ACLResolver.ResolveToken(token) require.NoError(t, err) require.NotNil(t, authz) require.Equal(t, acl.Allow, authz.KeyRead("foo", nil)) @@ -4084,7 +4051,7 @@ func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t err := msgpackrpc.CallWithCodec(codec, "ACL.PolicySet", &reqPolicy, &structs.ACLPolicy{}) require.NoError(t, err) - _, authz, err := srv.acls.ResolveTokenToIdentityAndAuthorizer(token) + authz, err := srv.ACLResolver.ResolveToken(token) require.NoError(t, err) require.NotNil(t, authz) require.Equal(t, acl.Deny, authz.KeyRead("foo", nil)) @@ -4100,7 +4067,7 @@ func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t err := msgpackrpc.CallWithCodec(codec, "ACL.TokenDelete", &req, &resp) require.NoError(t, err) - _, _, err = srv.acls.ResolveTokenToIdentityAndAuthorizer(token) + _, err = srv.ACLResolver.ResolveToken(token) require.True(t, acl.IsErrNotFound(err), "Error %v is not acl.ErrNotFound", err) }) } diff --git a/agent/consul/acl_token_exp.go b/agent/consul/acl_token_exp.go index a4dfa180fb..370d140ef7 100644 --- a/agent/consul/acl_token_exp.go +++ b/agent/consul/acl_token_exp.go @@ -107,7 +107,7 @@ func (s *Server) reapExpiredACLTokens(local, global bool) (int, error) { // Purge the identities from the cache for _, secretID := range secretIDs { - s.acls.cache.RemoveIdentity(tokenSecretCacheID(secretID)) + s.ACLResolver.cache.RemoveIdentity(tokenSecretCacheID(secretID)) } return len(req.TokenIDs), nil diff --git a/agent/consul/client.go b/agent/consul/client.go index 369595bc0d..4709c31085 100644 --- a/agent/consul/client.go +++ b/agent/consul/client.go @@ -56,7 +56,7 @@ type Client struct { config *Config // acls is used to resolve tokens to effective policies - acls *ACLResolver + *ACLResolver // Connection pool to consul servers connPool *pool.ConnPool @@ -127,7 +127,7 @@ func NewClient(config *Config, deps Deps) (*Client, error) { Tokens: deps.Tokens, } var err error - if c.acls, err = NewACLResolver(&aclConfig); err != nil { + if c.ACLResolver, err = NewACLResolver(&aclConfig); err != nil { c.Shutdown() return nil, fmt.Errorf("Failed to create ACL resolver: %v", err) } @@ -172,7 +172,7 @@ func (c *Client) Shutdown() error { // Close the connection pool c.connPool.Shutdown() - c.acls.Close() + c.ACLResolver.Close() return nil } diff --git a/agent/consul/connect_ca_endpoint_test.go b/agent/consul/connect_ca_endpoint_test.go index d170729db4..f32bf6ec1d 100644 --- a/agent/consul/connect_ca_endpoint_test.go +++ b/agent/consul/connect_ca_endpoint_test.go @@ -558,92 +558,88 @@ func TestConnectCAConfig_Vault_TriggerRotation_Fails(t *testing.T) { t.Parallel() testVault := ca.NewTestVaultServer(t) - defer testVault.Stop() + + newConfig := func(keyType string, keyBits int) map[string]interface{} { + return map[string]interface{}{ + "Address": testVault.Addr, + "Token": testVault.RootToken, + "RootPKIPath": "pki-root/", + "IntermediatePKIPath": "pki-intermediate/", + "PrivateKeyType": keyType, + "PrivateKeyBits": keyBits, + } + } _, s1 := testServerWithConfig(t, func(c *Config) { - c.Build = "1.6.0" - c.PrimaryDatacenter = "dc1" c.CAConfig = &structs.CAConfiguration{ Provider: "vault", - Config: map[string]interface{}{ - "Address": testVault.Addr, - "Token": testVault.RootToken, - "RootPKIPath": "pki-root/", - "IntermediatePKIPath": "pki-intermediate/", - }, + Config: newConfig(connect.DefaultPrivateKeyType, connect.DefaultPrivateKeyBits), } }) - defer s1.Shutdown() - - codec := rpcClient(t, s1) - defer codec.Close() - testrpc.WaitForTestAgent(t, s1.RPC, "dc1") - // Capture the current root. - { - rootList, _, err := getTestRoots(s1, "dc1") - require.NoError(t, err) - require.Len(t, rootList.Roots, 1) - } - - cases := []struct { + // note: unlike many table tests, the ordering of these cases does matter + // because any non-errored case will modify the CA config, and any subsequent + // tests will use the same agent with that new CA config. + testSteps := []struct { name string - configFn func() (*structs.CAConfiguration, error) + configFn func() *structs.CAConfiguration expectErr string }{ { - name: "cannot edit key bits", - configFn: func() (*structs.CAConfiguration, error) { + name: "allow modifying key type and bits from default", + configFn: func() *structs.CAConfiguration { return &structs.CAConfiguration{ - Provider: "vault", - Config: map[string]interface{}{ - "Address": testVault.Addr, - "Token": testVault.RootToken, - "RootPKIPath": "pki-root/", - "IntermediatePKIPath": "pki-intermediate/", - // - "PrivateKeyType": "ec", - "PrivateKeyBits": 384, - }, + Provider: "vault", + Config: newConfig("rsa", 4096), ForceWithoutCrossSigning: true, - }, nil + } }, - expectErr: `error generating CA root certificate: cannot update the PrivateKeyBits field without choosing a new PKI mount for the root CA`, }, { - name: "cannot edit key type", - configFn: func() (*structs.CAConfiguration, error) { + name: "error when trying to modify key bits", + configFn: func() *structs.CAConfiguration { return &structs.CAConfiguration{ - Provider: "vault", - Config: map[string]interface{}{ - "Address": testVault.Addr, - "Token": testVault.RootToken, - "RootPKIPath": "pki-root/", - "IntermediatePKIPath": "pki-intermediate/", - // - "PrivateKeyType": "rsa", - "PrivateKeyBits": 4096, - }, + Provider: "vault", + Config: newConfig("rsa", 2048), ForceWithoutCrossSigning: true, - }, nil + } + }, + expectErr: `cannot update the PrivateKeyBits field without changing RootPKIPath`, + }, + { + name: "error when trying to modify key type", + configFn: func() *structs.CAConfiguration { + return &structs.CAConfiguration{ + Provider: "vault", + Config: newConfig("ec", 256), + ForceWithoutCrossSigning: true, + } + }, + expectErr: `cannot update the PrivateKeyType field without changing RootPKIPath`, + }, + { + name: "allow update that does not change key type or bits", + configFn: func() *structs.CAConfiguration { + return &structs.CAConfiguration{ + Provider: "vault", + Config: newConfig("rsa", 4096), + ForceWithoutCrossSigning: true, + } }, - expectErr: `error generating CA root certificate: cannot update the PrivateKeyType field without choosing a new PKI mount for the root CA`, }, } - for _, tc := range cases { + for _, tc := range testSteps { t.Run(tc.name, func(t *testing.T) { - newConfig, err := tc.configFn() - require.NoError(t, err) - args := &structs.CARequest{ Datacenter: "dc1", - Config: newConfig, + Config: tc.configFn(), } var reply interface{} - err = msgpackrpc.CallWithCodec(codec, "ConnectCA.ConfigurationSet", args, &reply) + codec := rpcClient(t, s1) + err := msgpackrpc.CallWithCodec(codec, "ConnectCA.ConfigurationSet", args, &reply) if tc.expectErr == "" { require.NoError(t, err) } else { diff --git a/agent/consul/intention_endpoint.go b/agent/consul/intention_endpoint.go index 862637de5a..1fb8946623 100644 --- a/agent/consul/intention_endpoint.go +++ b/agent/consul/intention_endpoint.go @@ -100,20 +100,13 @@ func (s *Intention) Apply(args *structs.IntentionRequest, reply *string) error { } // Get the ACL token for the request for the checks below. - identity, authz, err := s.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + var entMeta structs.EnterpriseMeta + authz, err := s.srv.ACLResolver.ResolveTokenAndDefaultMeta(args.Token, &entMeta, nil) if err != nil { return err } - var accessorID string - var entMeta structs.EnterpriseMeta - if identity != nil { - entMeta.Merge(identity.EnterpriseMetadata()) - accessorID = identity.ID() - } else { - entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition()) - } - + accessorID := authz.AccessorID() var ( mut *structs.IntentionMutation legacyWrite bool @@ -432,7 +425,8 @@ func (s *Intention) Get(args *structs.IntentionQueryRequest, reply *structs.Inde // Get the ACL token for the request for the checks below. var entMeta structs.EnterpriseMeta - if _, err := s.srv.ResolveTokenAndDefaultMeta(args.Token, &entMeta, nil); err != nil { + authz, err := s.srv.ResolveTokenAndDefaultMeta(args.Token, &entMeta, nil) + if err != nil { return err } @@ -479,13 +473,11 @@ func (s *Intention) Get(args *structs.IntentionQueryRequest, reply *structs.Inde reply.Intentions = structs.Intentions{ixn} // Filter - if err := s.srv.filterACL(args.Token, reply); err != nil { - return err - } + s.srv.filterACLWithAuthorizer(authz, reply) // If ACLs prevented any responses, error if len(reply.Intentions) == 0 { - accessorID := s.aclAccessorID(args.Token) + accessorID := authz.AccessorID() // todo(kit) Migrate intention access denial logging over to audit logging when we implement it s.logger.Warn("Request to get intention denied due to ACLs", "intention", args.IntentionID, "accessorID", accessorID) return acl.ErrPermissionDenied @@ -618,7 +610,7 @@ func (s *Intention) Match(args *structs.IntentionQueryRequest, reply *structs.In for _, entry := range args.Match.Entries { entry.FillAuthzContext(&authzContext) if prefix := entry.Name; prefix != "" && authz.IntentionRead(prefix, &authzContext) != acl.Allow { - accessorID := s.aclAccessorID(args.Token) + accessorID := authz.AccessorID() // todo(kit) Migrate intention access denial logging over to audit logging when we implement it s.logger.Warn("Operation on intention prefix denied due to ACLs", "prefix", prefix, "accessorID", accessorID) return acl.ErrPermissionDenied @@ -708,7 +700,7 @@ func (s *Intention) Check(args *structs.IntentionQueryRequest, reply *structs.In var authzContext acl.AuthorizerContext query.FillAuthzContext(&authzContext) if authz.ServiceRead(prefix, &authzContext) != acl.Allow { - accessorID := s.aclAccessorID(args.Token) + accessorID := authz.AccessorID() // todo(kit) Migrate intention access denial logging over to audit logging when we implement it s.logger.Warn("test on intention denied due to ACLs", "prefix", prefix, "accessorID", accessorID) return acl.ErrPermissionDenied @@ -760,24 +752,6 @@ func (s *Intention) Check(args *structs.IntentionQueryRequest, reply *structs.In return nil } -// aclAccessorID is used to convert an ACLToken's secretID to its accessorID for non- -// critical purposes, such as logging. Therefore we interpret all errors as empty-string -// so we can safely log it without handling non-critical errors at the usage site. -func (s *Intention) aclAccessorID(secretID string) string { - _, ident, err := s.srv.ResolveIdentityFromToken(secretID) - if acl.IsErrNotFound(err) { - return "" - } - if err != nil { - s.logger.Debug("non-critical error resolving acl token accessor for logging", "error", err) - return "" - } - if ident == nil { - return "" - } - return ident.ID() -} - func (s *Intention) validateEnterpriseIntention(ixn *structs.Intention) error { if err := s.srv.validateEnterpriseIntentionPartition(ixn.SourcePartition); err != nil { return fmt.Errorf("Invalid source partition %q: %v", ixn.SourcePartition, err) diff --git a/agent/consul/internal_endpoint.go b/agent/consul/internal_endpoint.go index 14fbc4be41..0f7740a394 100644 --- a/agent/consul/internal_endpoint.go +++ b/agent/consul/internal_endpoint.go @@ -401,13 +401,13 @@ func (m *Internal) EventFire(args *structs.EventFireRequest, } // Check ACLs - authz, err := m.srv.ResolveToken(args.Token) + authz, err := m.srv.ResolveTokenAndDefaultMeta(args.Token, nil, nil) if err != nil { return err } if authz.EventWrite(args.Name, nil) != acl.Allow { - accessorID := m.aclAccessorID(args.Token) + accessorID := authz.AccessorID() m.logger.Warn("user event blocked by ACLs", "event", args.Name, "accessorID", accessorID) return acl.ErrPermissionDenied } @@ -433,11 +433,11 @@ func (m *Internal) KeyringOperation( } // Check ACLs - identity, authz, err := m.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := m.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := m.srv.validateEnterpriseToken(identity); err != nil { + if err := m.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } switch args.Operation { @@ -545,21 +545,3 @@ func (m *Internal) executeKeyringOpMgr( return serfResp, err } - -// aclAccessorID is used to convert an ACLToken's secretID to its accessorID for non- -// critical purposes, such as logging. Therefore we interpret all errors as empty-string -// so we can safely log it without handling non-critical errors at the usage site. -func (m *Internal) aclAccessorID(secretID string) string { - _, ident, err := m.srv.ResolveIdentityFromToken(secretID) - if acl.IsErrNotFound(err) { - return "" - } - if err != nil { - m.logger.Debug("non-critical error resolving acl token accessor for logging", "error", err) - return "" - } - if ident == nil { - return "" - } - return ident.ID() -} diff --git a/agent/consul/leader.go b/agent/consul/leader.go index 1b55767b15..d8bf099d0e 100644 --- a/agent/consul/leader.go +++ b/agent/consul/leader.go @@ -363,7 +363,7 @@ func (s *Server) initializeACLs(ctx context.Context) error { // Purge the cache, since it could've changed while we were not the // leader. - s.acls.cache.Purge() + s.ACLResolver.cache.Purge() // Purge the auth method validators since they could've changed while we // were not leader. diff --git a/agent/consul/leader_connect_ca.go b/agent/consul/leader_connect_ca.go index 203d3f2a40..47b5bafcee 100644 --- a/agent/consul/leader_connect_ca.go +++ b/agent/consul/leader_connect_ca.go @@ -654,7 +654,7 @@ func (c *CAManager) secondaryInitializeIntermediateCA(provider ca.Provider, conf } if needsNewIntermediate { - if err := c.secondaryRenewIntermediate(provider, newActiveRoot); err != nil { + if err := c.secondaryRequestNewSigningCert(provider, newActiveRoot); err != nil { return err } } else { @@ -781,7 +781,7 @@ func (c *CAManager) UpdateConfiguration(args *structs.CARequest) (reterr error) }() // Attempt to initialize the config if we failed to do so in Initialize for some reason - _, err = c.initializeCAConfig() + prevConfig, err := c.initializeCAConfig() if err != nil { return err } @@ -832,6 +832,15 @@ func (c *CAManager) UpdateConfiguration(args *structs.CARequest) (reterr error) RawConfig: args.Config.Config, State: args.Config.State, } + + if args.Config.Provider == config.Provider { + if validator, ok := newProvider.(ValidateConfigUpdater); ok { + if err := validator.ValidateConfigUpdate(prevConfig.Config, args.Config.Config); err != nil { + return fmt.Errorf("new configuration is incompatible with previous configuration: %w", err) + } + } + } + if err := newProvider.Configure(pCfg); err != nil { return fmt.Errorf("error configuring provider: %v", err) } @@ -858,6 +867,19 @@ func (c *CAManager) UpdateConfiguration(args *structs.CARequest) (reterr error) return nil } +// ValidateConfigUpdater is an optional interface that may be implemented +// by a ca.Provider. If the provider implements this interface, the +// ValidateConfigurationUpdate will be called when a user attempts to change the +// CA configuration, and the provider type has not changed from the previous +// configuration. +type ValidateConfigUpdater interface { + // ValidateConfigUpdate should return an error if the next configuration is + // incompatible with the previous configuration. + // + // TODO: use better types after https://github.com/hashicorp/consul/issues/12238 + ValidateConfigUpdate(previous, next map[string]interface{}) error +} + func (c *CAManager) primaryUpdateRootCA(newProvider ca.Provider, args *structs.CARequest, config *structs.CAConfiguration) error { providerRoot, err := newProvider.GenerateRoot() if err != nil { @@ -1028,9 +1050,11 @@ func (c *CAManager) primaryRenewIntermediate(provider ca.Provider, newActiveRoot return nil } -// secondaryRenewIntermediate should only be called while the state lock is held by -// setting the state to non-ready. -func (c *CAManager) secondaryRenewIntermediate(provider ca.Provider, newActiveRoot *structs.CARoot) error { +// secondaryRequestNewSigningCert creates a Certificate Signing Request, sends +// the request to the primary, and stores the received certificate in the +// provider. +// Should only be called while the state lock is held by setting the state to non-ready. +func (c *CAManager) secondaryRequestNewSigningCert(provider ca.Provider, newActiveRoot *structs.CARoot) error { csr, err := provider.GenerateIntermediateCSR() if err != nil { return err @@ -1145,7 +1169,7 @@ func (c *CAManager) RenewIntermediate(ctx context.Context, isPrimary bool) error // Enough time has passed, go ahead with getting a new intermediate. renewalFunc := c.primaryRenewIntermediate if !isPrimary { - renewalFunc = c.secondaryRenewIntermediate + renewalFunc = c.secondaryRequestNewSigningCert } errCh := make(chan error, 1) go func() { diff --git a/agent/consul/leader_connect_ca_test.go b/agent/consul/leader_connect_ca_test.go index 17b310cb6a..c3115668e7 100644 --- a/agent/consul/leader_connect_ca_test.go +++ b/agent/consul/leader_connect_ca_test.go @@ -17,6 +17,7 @@ import ( "time" msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc" + vaultapi "github.com/hashicorp/vault/api" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -606,6 +607,88 @@ func TestCAManager_UpdateConfiguration_Vault_Primary(t *testing.T) { require.Equal(t, connect.HexString(cert.SubjectKeyId), newRoot.SigningKeyID) } +func TestCAManager_Initialize_Vault_WithIntermediateAsPrimaryCA(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + ca.SkipIfVaultNotPresent(t) + + vault := ca.NewTestVaultServer(t) + vclient := vault.Client() + generateExternalRootCA(t, vclient) + + meshRootPath := "pki-root" + primaryCert := setupPrimaryCA(t, vclient, meshRootPath) + + _, s1 := testServerWithConfig(t, func(c *Config) { + c.CAConfig = &structs.CAConfiguration{ + Provider: "vault", + Config: map[string]interface{}{ + "Address": vault.Addr, + "Token": vault.RootToken, + "RootPKIPath": meshRootPath, + "IntermediatePKIPath": "pki-intermediate/", + // TODO: there are failures to init the CA system if these are not set + // to the values of the already initialized CA. + "PrivateKeyType": "ec", + "PrivateKeyBits": 256, + }, + } + }) + defer s1.Shutdown() + + runStep(t, "check primary DC", func(t *testing.T) { + testrpc.WaitForTestAgent(t, s1.RPC, "dc1") + + codec := rpcClient(t, s1) + roots := structs.IndexedCARoots{} + err := msgpackrpc.CallWithCodec(codec, "ConnectCA.Roots", &structs.DCSpecificRequest{}, &roots) + require.NoError(t, err) + require.Len(t, roots.Roots, 1) + require.Equal(t, primaryCert, roots.Roots[0].RootCert) + + leafCertPEM := getLeafCert(t, codec, roots.TrustDomain, "dc1") + verifyLeafCert(t, roots.Roots[0], leafCertPEM) + }) + + // TODO: renew primary leaf signing cert + // TODO: rotate root + + runStep(t, "run secondary DC", func(t *testing.T) { + _, sDC2 := testServerWithConfig(t, func(c *Config) { + c.Datacenter = "dc2" + c.PrimaryDatacenter = "dc1" + c.CAConfig = &structs.CAConfiguration{ + Provider: "vault", + Config: map[string]interface{}{ + "Address": vault.Addr, + "Token": vault.RootToken, + "RootPKIPath": meshRootPath, + "IntermediatePKIPath": "pki-secondary/", + // TODO: there are failures to init the CA system if these are not set + // to the values of the already initialized CA. + "PrivateKeyType": "ec", + "PrivateKeyBits": 256, + }, + } + }) + defer sDC2.Shutdown() + joinWAN(t, sDC2, s1) + testrpc.WaitForActiveCARoot(t, sDC2.RPC, "dc2", nil) + + codec := rpcClient(t, sDC2) + roots := structs.IndexedCARoots{} + err := msgpackrpc.CallWithCodec(codec, "ConnectCA.Roots", &structs.DCSpecificRequest{}, &roots) + require.NoError(t, err) + require.Len(t, roots.Roots, 1) + + leafCertPEM := getLeafCert(t, codec, roots.TrustDomain, "dc2") + verifyLeafCert(t, roots.Roots[0], leafCertPEM) + + // TODO: renew secondary leaf signing cert + }) +} + func getLeafCert(t *testing.T, codec rpc.ClientCodec, trustDomain string, dc string) string { pk, _, err := connect.GeneratePrivateKey() require.NoError(t, err) @@ -624,3 +707,58 @@ func getLeafCert(t *testing.T, codec rpc.ClientCodec, trustDomain string, dc str return cert.CertPEM } + +func generateExternalRootCA(t *testing.T, client *vaultapi.Client) string { + t.Helper() + err := client.Sys().Mount("corp", &vaultapi.MountInput{ + Type: "pki", + Description: "External root, probably corporate CA", + Config: vaultapi.MountConfigInput{ + MaxLeaseTTL: "2400h", + DefaultLeaseTTL: "1h", + }, + }) + require.NoError(t, err, "failed to mount") + + resp, err := client.Logical().Write("corp/root/generate/internal", map[string]interface{}{ + "common_name": "corporate CA", + "ttl": "2400h", + }) + require.NoError(t, err, "failed to generate root") + return resp.Data["certificate"].(string) +} + +func setupPrimaryCA(t *testing.T, client *vaultapi.Client, path string) string { + t.Helper() + err := client.Sys().Mount(path, &vaultapi.MountInput{ + Type: "pki", + Description: "primary CA for Consul CA", + Config: vaultapi.MountConfigInput{ + MaxLeaseTTL: "2200h", + DefaultLeaseTTL: "1h", + }, + }) + require.NoError(t, err, "failed to mount") + + out, err := client.Logical().Write(path+"/intermediate/generate/internal", map[string]interface{}{ + "common_name": "primary CA", + "ttl": "2200h", + "key_type": "ec", + "key_bits": 256, + }) + require.NoError(t, err, "failed to generate root") + + intermediate, err := client.Logical().Write("corp/root/sign-intermediate", map[string]interface{}{ + "csr": out.Data["csr"], + "use_csr_values": true, + "format": "pem_bundle", + "ttl": "2200h", + }) + require.NoError(t, err, "failed to sign intermediate") + + _, err = client.Logical().Write(path+"/intermediate/set-signed", map[string]interface{}{ + "certificate": intermediate.Data["certificate"], + }) + require.NoError(t, err, "failed to set signed intermediate") + return ca.EnsureTrailingNewline(intermediate.Data["certificate"].(string)) +} diff --git a/agent/consul/operator_autopilot_endpoint.go b/agent/consul/operator_autopilot_endpoint.go index 9430b30de3..2ee85bb062 100644 --- a/agent/consul/operator_autopilot_endpoint.go +++ b/agent/consul/operator_autopilot_endpoint.go @@ -17,11 +17,11 @@ func (op *Operator) AutopilotGetConfiguration(args *structs.DCSpecificRequest, r } // This action requires operator read access. - identity, authz, err := op.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := op.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := op.srv.validateEnterpriseToken(identity); err != nil { + if err := op.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } if authz.OperatorRead(nil) != acl.Allow { @@ -49,11 +49,11 @@ func (op *Operator) AutopilotSetConfiguration(args *structs.AutopilotSetConfigRe } // This action requires operator write access. - identity, authz, err := op.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := op.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := op.srv.validateEnterpriseToken(identity); err != nil { + if err := op.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } if authz.OperatorWrite(nil) != acl.Allow { @@ -84,11 +84,11 @@ func (op *Operator) ServerHealth(args *structs.DCSpecificRequest, reply *structs } // This action requires operator read access. - identity, authz, err := op.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := op.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := op.srv.validateEnterpriseToken(identity); err != nil { + if err := op.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } if authz.OperatorRead(nil) != acl.Allow { @@ -151,11 +151,11 @@ func (op *Operator) AutopilotState(args *structs.DCSpecificRequest, reply *autop } // This action requires operator read access. - identity, authz, err := op.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := op.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := op.srv.validateEnterpriseToken(identity); err != nil { + if err := op.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } if authz.OperatorRead(nil) != acl.Allow { diff --git a/agent/consul/operator_raft_endpoint.go b/agent/consul/operator_raft_endpoint.go index 4cf38185ad..33f9ad7ff1 100644 --- a/agent/consul/operator_raft_endpoint.go +++ b/agent/consul/operator_raft_endpoint.go @@ -81,11 +81,11 @@ func (op *Operator) RaftRemovePeerByAddress(args *structs.RaftRemovePeerRequest, // This is a super dangerous operation that requires operator write // access. - identity, authz, err := op.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := op.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := op.srv.validateEnterpriseToken(identity); err != nil { + if err := op.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } if authz.OperatorWrite(nil) != acl.Allow { @@ -134,11 +134,11 @@ func (op *Operator) RaftRemovePeerByID(args *structs.RaftRemovePeerRequest, repl // This is a super dangerous operation that requires operator write // access. - identity, authz, err := op.srv.acls.ResolveTokenToIdentityAndAuthorizer(args.Token) + authz, err := op.srv.ACLResolver.ResolveToken(args.Token) if err != nil { return err } - if err := op.srv.validateEnterpriseToken(identity); err != nil { + if err := op.srv.validateEnterpriseToken(authz.Identity()); err != nil { return err } if authz.OperatorWrite(nil) != acl.Allow { diff --git a/agent/consul/server.go b/agent/consul/server.go index a3a9b75ca5..4d26ea6e8d 100644 --- a/agent/consul/server.go +++ b/agent/consul/server.go @@ -141,7 +141,7 @@ type Server struct { aclConfig *acl.Config // acls is used to resolve tokens to effective policies - acls *ACLResolver + *ACLResolver aclAuthMethodValidators authmethod.Cache @@ -457,7 +457,7 @@ func NewServer(config *Config, flat Deps) (*Server, error) { Tokens: flat.Tokens, } // Initialize the ACL resolver. - if s.acls, err = NewACLResolver(&aclConfig); err != nil { + if s.ACLResolver, err = NewACLResolver(&aclConfig); err != nil { s.Shutdown() return nil, fmt.Errorf("Failed to create ACL resolver: %v", err) } @@ -994,8 +994,8 @@ func (s *Server) Shutdown() error { s.connPool.Shutdown() } - if s.acls != nil { - s.acls.Close() + if s.ACLResolver != nil { + s.ACLResolver.Close() } if s.fsm != nil { diff --git a/agent/consul/server_serf.go b/agent/consul/server_serf.go index 44c3f857a4..ff1b1e4064 100644 --- a/agent/consul/server_serf.go +++ b/agent/consul/server_serf.go @@ -121,7 +121,7 @@ func (s *Server) setupSerfConfig(opts setupSerfOptions) (*serf.Config, error) { // TODO(ACL-Legacy-Compat): remove in phase 2. These are kept for now to // allow for upgrades. - if s.acls.ACLsEnabled() { + if s.ACLResolver.ACLsEnabled() { conf.Tags[metadata.TagACLs] = string(structs.ACLModeEnabled) } else { conf.Tags[metadata.TagACLs] = string(structs.ACLModeDisabled) diff --git a/agent/coordinate_endpoint.go b/agent/coordinate_endpoint.go index 822ef5b39b..ff3df3d06c 100644 --- a/agent/coordinate_endpoint.go +++ b/agent/coordinate_endpoint.go @@ -8,16 +8,13 @@ import ( "github.com/hashicorp/consul/agent/structs" ) -// checkCoordinateDisabled will return a standard response if coordinates are -// disabled. This returns true if they are disabled and we should not continue. -func (s *HTTPHandlers) checkCoordinateDisabled(resp http.ResponseWriter, req *http.Request) bool { +// checkCoordinateDisabled will return an unauthorized error if coordinates are +// disabled. Otherwise, a nil error will be returned. +func (s *HTTPHandlers) checkCoordinateDisabled() error { if !s.agent.config.DisableCoordinates { - return false + return nil } - - resp.WriteHeader(http.StatusUnauthorized) - fmt.Fprint(resp, "Coordinate support disabled") - return true + return UnauthorizedError{Reason: "Coordinate support disabled"} } // sorter wraps a coordinate list and implements the sort.Interface to sort by @@ -44,8 +41,8 @@ func (s *sorter) Less(i, j int) bool { // CoordinateDatacenters returns the WAN nodes in each datacenter, along with // raw network coordinates. func (s *HTTPHandlers) CoordinateDatacenters(resp http.ResponseWriter, req *http.Request) (interface{}, error) { - if s.checkCoordinateDisabled(resp, req) { - return nil, nil + if err := s.checkCoordinateDisabled(); err != nil { + return nil, err } var out []structs.DatacenterMap @@ -73,8 +70,8 @@ func (s *HTTPHandlers) CoordinateDatacenters(resp http.ResponseWriter, req *http // CoordinateNodes returns the LAN nodes in the given datacenter, along with // raw network coordinates. func (s *HTTPHandlers) CoordinateNodes(resp http.ResponseWriter, req *http.Request) (interface{}, error) { - if s.checkCoordinateDisabled(resp, req) { - return nil, nil + if err := s.checkCoordinateDisabled(); err != nil { + return nil, err } args := structs.DCSpecificRequest{} @@ -98,8 +95,8 @@ func (s *HTTPHandlers) CoordinateNodes(resp http.ResponseWriter, req *http.Reque // CoordinateNode returns the LAN node in the given datacenter, along with // raw network coordinates. func (s *HTTPHandlers) CoordinateNode(resp http.ResponseWriter, req *http.Request) (interface{}, error) { - if s.checkCoordinateDisabled(resp, req) { - return nil, nil + if err := s.checkCoordinateDisabled(); err != nil { + return nil, err } node, err := getPathSuffixUnescaped(req.URL.Path, "/v1/coordinate/node/") @@ -153,15 +150,13 @@ func filterCoordinates(req *http.Request, in structs.Coordinates) structs.Coordi // CoordinateUpdate inserts or updates the LAN coordinate of a node. func (s *HTTPHandlers) CoordinateUpdate(resp http.ResponseWriter, req *http.Request) (interface{}, error) { - if s.checkCoordinateDisabled(resp, req) { - return nil, nil + if err := s.checkCoordinateDisabled(); err != nil { + return nil, err } args := structs.CoordinateUpdateRequest{} if err := decodeBody(req.Body, &args); err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Request decode failed: %v", err) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Request decode failed: %v", err)} } s.parseDC(req, &args.Datacenter) s.parseToken(req, &args.Token) diff --git a/agent/coordinate_endpoint_test.go b/agent/coordinate_endpoint_test.go index 36b956a8f8..ff38d83227 100644 --- a/agent/coordinate_endpoint_test.go +++ b/agent/coordinate_endpoint_test.go @@ -39,16 +39,14 @@ func TestCoordinate_Disabled_Response(t *testing.T) { req, _ := http.NewRequest("PUT", "/should/not/care", nil) resp := httptest.NewRecorder() obj, err := tt(resp, req) - if err != nil { - t.Fatalf("err: %v", err) + err, ok := err.(UnauthorizedError) + if !ok { + t.Fatalf("expected unauthorized error but got %v", err) } if obj != nil { t.Fatalf("bad: %#v", obj) } - if got, want := resp.Code, http.StatusUnauthorized; got != want { - t.Fatalf("got %d want %d", got, want) - } - if !strings.Contains(resp.Body.String(), "Coordinate support disabled") { + if !strings.Contains(err.Error(), "Coordinate support disabled") { t.Fatalf("bad: %#v", resp) } }) diff --git a/agent/delegate_mock_test.go b/agent/delegate_mock_test.go index 678b0b87bc..d2c6e267ce 100644 --- a/agent/delegate_mock_test.go +++ b/agent/delegate_mock_test.go @@ -47,11 +47,6 @@ func (m *delegateMock) RemoveFailedNode(node string, prune bool, entMeta *struct return m.Called(node, prune, entMeta).Error(0) } -func (m *delegateMock) ResolveTokenToIdentity(token string) (structs.ACLIdentity, error) { - ret := m.Called(token) - return ret.Get(0).(structs.ACLIdentity), ret.Error(1) -} - func (m *delegateMock) ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (acl.Authorizer, error) { ret := m.Called(token, entMeta, authzContext) return ret.Get(0).(acl.Authorizer), ret.Error(1) diff --git a/agent/discovery_chain_endpoint.go b/agent/discovery_chain_endpoint.go index ec3d46e9e6..666841ef32 100644 --- a/agent/discovery_chain_endpoint.go +++ b/agent/discovery_chain_endpoint.go @@ -51,9 +51,7 @@ func (s *HTTPHandlers) DiscoveryChainRead(resp http.ResponseWriter, req *http.Re if apiReq.OverrideMeshGateway.Mode != "" { _, err := structs.ValidateMeshGatewayMode(string(apiReq.OverrideMeshGateway.Mode)) if err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Invalid OverrideMeshGateway.Mode parameter") - return nil, nil + return nil, BadRequestError{Reason: "Invalid OverrideMeshGateway.Mode parameter"} } args.OverrideMeshGateway = apiReq.OverrideMeshGateway } diff --git a/agent/event_endpoint.go b/agent/event_endpoint.go index 10421d6202..53b0e5d65b 100644 --- a/agent/event_endpoint.go +++ b/agent/event_endpoint.go @@ -2,7 +2,6 @@ package agent import ( "bytes" - "fmt" "io" "net/http" "strconv" @@ -26,9 +25,7 @@ func (s *HTTPHandlers) EventFire(resp http.ResponseWriter, req *http.Request) (i return nil, err } if event.Name == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing name") - return nil, nil + return nil, BadRequestError{Reason: "Missing name"} } // Get the ACL token @@ -58,9 +55,7 @@ func (s *HTTPHandlers) EventFire(resp http.ResponseWriter, req *http.Request) (i // Try to fire the event if err := s.agent.UserEvent(dc, token, event); err != nil { if acl.IsErrPermissionDenied(err) { - resp.WriteHeader(http.StatusForbidden) - fmt.Fprint(resp, acl.ErrPermissionDenied.Error()) - return nil, nil + return nil, ForbiddenError{Reason: acl.ErrPermissionDenied.Error()} } resp.WriteHeader(http.StatusInternalServerError) return nil, err diff --git a/agent/event_endpoint_test.go b/agent/event_endpoint_test.go index d430c15ddb..e5f0b39f73 100644 --- a/agent/event_endpoint_test.go +++ b/agent/event_endpoint_test.go @@ -88,13 +88,11 @@ func TestEventFire_token(t *testing.T) { url := fmt.Sprintf("/v1/event/fire/%s?token=%s", c.event, token) req, _ := http.NewRequest("PUT", url, nil) resp := httptest.NewRecorder() - if _, err := a.srv.EventFire(resp, req); err != nil { - t.Fatalf("err: %s", err) - } + _, err := a.srv.EventFire(resp, req) // Check the result - body := resp.Body.String() if c.allowed { + body := resp.Body.String() if acl.IsErrPermissionDenied(errors.New(body)) { t.Fatalf("bad: %s", body) } @@ -102,11 +100,11 @@ func TestEventFire_token(t *testing.T) { t.Fatalf("bad: %d", resp.Code) } } else { - if !acl.IsErrPermissionDenied(errors.New(body)) { - t.Fatalf("bad: %s", body) + if !acl.IsErrPermissionDenied(err) { + t.Fatalf("bad: %s", err.Error()) } - if resp.Code != 403 { - t.Fatalf("bad: %d", resp.Code) + if err, ok := err.(ForbiddenError); !ok { + t.Fatalf("Expected forbidden but got %v", err) } } } diff --git a/agent/health_endpoint.go b/agent/health_endpoint.go index f6e803a3cb..faa37b6157 100644 --- a/agent/health_endpoint.go +++ b/agent/health_endpoint.go @@ -1,7 +1,6 @@ package agent import ( - "fmt" "net/http" "net/url" "strconv" @@ -36,9 +35,7 @@ func (s *HTTPHandlers) HealthChecksInState(resp http.ResponseWriter, req *http.R return nil, err } if args.State == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing check state") - return nil, nil + return nil, BadRequestError{Reason: "Missing check state"} } // Make the RPC request @@ -82,9 +79,7 @@ func (s *HTTPHandlers) HealthNodeChecks(resp http.ResponseWriter, req *http.Requ // Pull out the service name args.Node = strings.TrimPrefix(req.URL.Path, "/v1/health/node/") if args.Node == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing node name") - return nil, nil + return nil, BadRequestError{Reason: "Missing node name"} } // Make the RPC request @@ -130,9 +125,7 @@ func (s *HTTPHandlers) HealthServiceChecks(resp http.ResponseWriter, req *http.R // Pull out the service name args.ServiceName = strings.TrimPrefix(req.URL.Path, "/v1/health/checks/") if args.ServiceName == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing service name") - return nil, nil + return nil, BadRequestError{Reason: "Missing service name"} } // Make the RPC request @@ -218,9 +211,7 @@ func (s *HTTPHandlers) healthServiceNodes(resp http.ResponseWriter, req *http.Re // Pull out the service name args.ServiceName = strings.TrimPrefix(req.URL.Path, prefix) if args.ServiceName == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing service name") - return nil, nil + return nil, BadRequestError{Reason: "Missing service name"} } out, md, err := s.agent.rpcClientHealth.ServiceNodes(req.Context(), args) @@ -238,9 +229,7 @@ func (s *HTTPHandlers) healthServiceNodes(resp http.ResponseWriter, req *http.Re // Filter to only passing if specified filter, err := getBoolQueryParam(params, api.HealthPassing) if err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Invalid value for ?passing") - return nil, nil + return nil, BadRequestError{Reason: "Invalid value for ?passing"} } // FIXME: remove filterNonPassing, replace with nodes.Filter, which is used by DNSServer diff --git a/agent/health_endpoint_test.go b/agent/health_endpoint_test.go index 5bd5444edf..baa4c43423 100644 --- a/agent/health_endpoint_test.go +++ b/agent/health_endpoint_test.go @@ -1,14 +1,13 @@ package agent import ( - "bytes" "fmt" - "io/ioutil" "net/http" "net/http/httptest" "net/url" "reflect" "strconv" + "strings" "testing" "time" @@ -1241,18 +1240,12 @@ func TestHealthServiceNodes_PassingFilter(t *testing.T) { t.Run("passing_bad", func(t *testing.T) { req, _ := http.NewRequest("GET", "/v1/health/service/consul?passing=nope-nope-nope", nil) resp := httptest.NewRecorder() - a.srv.HealthServiceNodes(resp, req) - - if code := resp.Code; code != 400 { - t.Errorf("bad response code %d, expected %d", code, 400) + _, err := a.srv.HealthServiceNodes(resp, req) + if _, ok := err.(BadRequestError); !ok { + t.Fatalf("Expected bad request error but got %v", err) } - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Contains(body, []byte("Invalid value for ?passing")) { - t.Errorf("bad %s", body) + if !strings.Contains(err.Error(), "Invalid value for ?passing") { + t.Errorf("bad %s", err.Error()) } }) } @@ -1654,12 +1647,12 @@ func TestHealthConnectServiceNodes_PassingFilter(t *testing.T) { req, _ := http.NewRequest("GET", fmt.Sprintf( "/v1/health/connect/%s?passing=nope-nope", args.Service.Proxy.DestinationServiceName), nil) resp := httptest.NewRecorder() - a.srv.HealthConnectServiceNodes(resp, req) - assert.Equal(t, 400, resp.Code) + _, err := a.srv.HealthConnectServiceNodes(resp, req) + assert.NotNil(t, err) + _, ok := err.(BadRequestError) + assert.True(t, ok) - body, err := ioutil.ReadAll(resp.Body) - assert.Nil(t, err) - assert.True(t, bytes.Contains(body, []byte("Invalid value for ?passing"))) + assert.True(t, strings.Contains(err.Error(), "Invalid value for ?passing")) }) } diff --git a/agent/http.go b/agent/http.go index 5fc84ea113..b470547ed1 100644 --- a/agent/http.go +++ b/agent/http.go @@ -78,6 +78,14 @@ func (e UnauthorizedError) Error() string { return e.Reason } +type EntityTooLargeError struct { + Reason string +} + +func (e EntityTooLargeError) Error() string { + return e.Reason +} + // CodeWithPayloadError allow returning non HTTP 200 // Error codes while not returning PlainText payload type CodeWithPayloadError struct { @@ -91,10 +99,11 @@ func (e CodeWithPayloadError) Error() string { } type ForbiddenError struct { + Reason string } func (e ForbiddenError) Error() string { - return "Access is restricted" + return e.Reason } // HTTPHandlers provides an HTTP api for an agent. @@ -443,6 +452,11 @@ func (s *HTTPHandlers) wrap(handler endpoint, methods []string) http.HandlerFunc return err.Error() == consul.ErrRateLimited.Error() } + isEntityToLarge := func(err error) bool { + _, ok := err.(EntityTooLargeError) + return ok + } + addAllowHeader := func(methods []string) { resp.Header().Add("Allow", strings.Join(methods, ",")) } @@ -488,6 +502,9 @@ func (s *HTTPHandlers) wrap(handler endpoint, methods []string) http.HandlerFunc case isTooManyRequests(err): resp.WriteHeader(http.StatusTooManyRequests) fmt.Fprint(resp, err.Error()) + case isEntityToLarge(err): + resp.WriteHeader(http.StatusRequestEntityTooLarge) + fmt.Fprint(resp, err.Error()) default: resp.WriteHeader(http.StatusInternalServerError) fmt.Fprint(resp, err.Error()) @@ -1136,7 +1153,7 @@ func (s *HTTPHandlers) checkWriteAccess(req *http.Request) error { } } - return ForbiddenError{} + return ForbiddenError{Reason: "Access is restricted"} } func (s *HTTPHandlers) parseFilter(req *http.Request, filter *string) { diff --git a/agent/intentions_endpoint.go b/agent/intentions_endpoint.go index 2bb55b7f4b..4c326b4f1e 100644 --- a/agent/intentions_endpoint.go +++ b/agent/intentions_endpoint.go @@ -323,9 +323,7 @@ func (s *HTTPHandlers) IntentionGetExact(resp http.ResponseWriter, req *http.Req if err := s.agent.RPC("Intention.Get", &args, &reply); err != nil { // We have to check the string since the RPC sheds the error type if err.Error() == consul.ErrIntentionNotFound.Error() { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprint(resp, err.Error()) - return nil, nil + return nil, NotFoundError{Reason: err.Error()} } // Not ideal, but there are a number of error scenarios that are not @@ -521,9 +519,7 @@ func (s *HTTPHandlers) IntentionSpecificGet(id string, resp http.ResponseWriter, if err := s.agent.RPC("Intention.Get", &args, &reply); err != nil { // We have to check the string since the RPC sheds the error type if err.Error() == consul.ErrIntentionNotFound.Error() { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprint(resp, err.Error()) - return nil, nil + return nil, NotFoundError{Reason: err.Error()} } // Not ideal, but there are a number of error scenarios that are not diff --git a/agent/kvs_endpoint.go b/agent/kvs_endpoint.go index b6bed301be..4b8cc3348f 100644 --- a/agent/kvs_endpoint.go +++ b/agent/kvs_endpoint.go @@ -55,8 +55,8 @@ func (s *HTTPHandlers) KVSGet(resp http.ResponseWriter, req *http.Request, args params := req.URL.Query() if _, ok := params["recurse"]; ok { method = "KVS.List" - } else if missingKey(resp, args) { - return nil, nil + } else if args.Key == "" { + return nil, BadRequestError{Reason: "Missing key name"} } // Do not allow wildcard NS on GET reqs @@ -156,8 +156,8 @@ func (s *HTTPHandlers) KVSPut(resp http.ResponseWriter, req *http.Request, args if err := s.parseEntMetaNoWildcard(req, &args.EnterpriseMeta); err != nil { return nil, err } - if missingKey(resp, args) { - return nil, nil + if args.Key == "" { + return nil, BadRequestError{Reason: "Missing key name"} } if conflictingFlags(resp, req, "cas", "acquire", "release") { return nil, nil @@ -208,13 +208,10 @@ func (s *HTTPHandlers) KVSPut(resp http.ResponseWriter, req *http.Request, args // Check the content-length if req.ContentLength > int64(s.agent.config.KVMaxValueSize) { - resp.WriteHeader(http.StatusRequestEntityTooLarge) - fmt.Fprintf(resp, - "Request body(%d bytes) too large, max size: %d bytes. See %s.", - req.ContentLength, s.agent.config.KVMaxValueSize, - "https://www.consul.io/docs/agent/options.html#kv_max_value_size", - ) - return nil, nil + return nil, EntityTooLargeError{ + Reason: fmt.Sprintf("Request body(%d bytes) too large, max size: %d bytes. See %s.", + req.ContentLength, s.agent.config.KVMaxValueSize, "https://www.consul.io/docs/agent/options.html#kv_max_value_size"), + } } // Copy the value @@ -259,8 +256,8 @@ func (s *HTTPHandlers) KVSDelete(resp http.ResponseWriter, req *http.Request, ar params := req.URL.Query() if _, ok := params["recurse"]; ok { applyReq.Op = api.KVDeleteTree - } else if missingKey(resp, args) { - return nil, nil + } else if args.Key == "" { + return nil, BadRequestError{Reason: "Missing key name"} } // Check for cas value @@ -286,16 +283,6 @@ func (s *HTTPHandlers) KVSDelete(resp http.ResponseWriter, req *http.Request, ar return true, nil } -// missingKey checks if the key is missing -func missingKey(resp http.ResponseWriter, args *structs.KeyRequest) bool { - if args.Key == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing key name") - return true - } - return false -} - // conflictingFlags determines if non-composable flags were passed in a request. func conflictingFlags(resp http.ResponseWriter, req *http.Request, flags ...string) bool { params := req.URL.Query() diff --git a/agent/local/state.go b/agent/local/state.go index 5c70b0c8d0..1eb5733bbe 100644 --- a/agent/local/state.go +++ b/agent/local/state.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/go-hclog" "github.com/hashicorp/consul/acl" + "github.com/hashicorp/consul/agent/consul" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/api" @@ -150,7 +151,7 @@ func (c *CheckState) CriticalFor() time.Duration { type rpc interface { RPC(method string, args interface{}, reply interface{}) error - ResolveTokenToIdentity(secretID string) (structs.ACLIdentity, error) + ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (consul.ACLResolveResult, error) } // State is used to represent the node's services, @@ -1538,7 +1539,7 @@ func (l *State) notifyIfAliased(serviceID structs.ServiceID) { // critical purposes, such as logging. Therefore we interpret all errors as empty-string // so we can safely log it without handling non-critical errors at the usage site. func (l *State) aclAccessorID(secretID string) string { - ident, err := l.Delegate.ResolveTokenToIdentity(secretID) + ident, err := l.Delegate.ResolveTokenAndDefaultMeta(secretID, nil, nil) if acl.IsErrNotFound(err) { return "" } @@ -1546,8 +1547,5 @@ func (l *State) aclAccessorID(secretID string) string { l.logger.Debug("non-critical error resolving acl token accessor for logging", "error", err) return "" } - if ident == nil { - return "" - } - return ident.ID() + return ident.AccessorID() } diff --git a/agent/local/state_test.go b/agent/local/state_test.go index 036e156fc1..1be9274e1a 100644 --- a/agent/local/state_test.go +++ b/agent/local/state_test.go @@ -12,8 +12,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent" "github.com/hashicorp/consul/agent/config" + "github.com/hashicorp/consul/agent/consul" "github.com/hashicorp/consul/agent/local" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/token" @@ -2372,6 +2374,6 @@ func (f *fakeRPC) RPC(method string, args interface{}, reply interface{}) error return nil } -func (f *fakeRPC) ResolveTokenToIdentity(_ string) (structs.ACLIdentity, error) { - return nil, nil +func (f *fakeRPC) ResolveTokenAndDefaultMeta(string, *structs.EnterpriseMeta, *acl.AuthorizerContext) (consul.ACLResolveResult, error) { + return consul.ACLResolveResult{}, nil } diff --git a/agent/prepared_query_endpoint.go b/agent/prepared_query_endpoint.go index 31e900288e..b398e24465 100644 --- a/agent/prepared_query_endpoint.go +++ b/agent/prepared_query_endpoint.go @@ -23,9 +23,7 @@ func (s *HTTPHandlers) preparedQueryCreate(resp http.ResponseWriter, req *http.R s.parseDC(req, &args.Datacenter) s.parseToken(req, &args.Token) if err := decodeBody(req.Body, &args.Query); err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Request decode failed: %v", err) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Request decode failed: %v", err)} } var reply string @@ -145,9 +143,7 @@ func (s *HTTPHandlers) preparedQueryExecute(id string, resp http.ResponseWriter, // We have to check the string since the RPC sheds // the specific error type. if structs.IsErrQueryNotFound(err) { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprint(resp, err.Error()) - return nil, nil + return nil, NotFoundError{Reason: err.Error()} } return nil, err } @@ -200,9 +196,7 @@ RETRY_ONCE: // We have to check the string since the RPC sheds // the specific error type. if structs.IsErrQueryNotFound(err) { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprint(resp, err.Error()) - return nil, nil + return nil, NotFoundError{Reason: err.Error()} } return nil, err } @@ -231,9 +225,7 @@ RETRY_ONCE: // We have to check the string since the RPC sheds // the specific error type. if structs.IsErrQueryNotFound(err) { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprint(resp, err.Error()) - return nil, nil + return nil, NotFoundError{Reason: err.Error()} } return nil, err } @@ -255,9 +247,7 @@ func (s *HTTPHandlers) preparedQueryUpdate(id string, resp http.ResponseWriter, s.parseToken(req, &args.Token) if req.ContentLength > 0 { if err := decodeBody(req.Body, &args.Query); err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Request decode failed: %v", err) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Request decode failed: %v", err)} } } diff --git a/agent/prepared_query_endpoint_test.go b/agent/prepared_query_endpoint_test.go index 79658f8c11..e4d3056e83 100644 --- a/agent/prepared_query_endpoint_test.go +++ b/agent/prepared_query_endpoint_test.go @@ -620,11 +620,9 @@ func TestPreparedQuery_Execute(t *testing.T) { body := bytes.NewBuffer(nil) req, _ := http.NewRequest("GET", "/v1/query/not-there/execute", body) resp := httptest.NewRecorder() - if _, err := a.srv.PreparedQuerySpecific(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 404 { - t.Fatalf("bad code: %d", resp.Code) + _, err := a.srv.PreparedQuerySpecific(resp, req) + if err, ok := err.(NotFoundError); !ok { + t.Fatalf("Expected not found error but got %v", err) } }) } @@ -757,11 +755,9 @@ func TestPreparedQuery_Explain(t *testing.T) { body := bytes.NewBuffer(nil) req, _ := http.NewRequest("GET", "/v1/query/not-there/explain", body) resp := httptest.NewRecorder() - if _, err := a.srv.PreparedQuerySpecific(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 404 { - t.Fatalf("bad code: %d", resp.Code) + _, err := a.srv.PreparedQuerySpecific(resp, req) + if err, ok := err.(NotFoundError); !ok { + t.Fatalf("Expected not found error but got %v", err) } }) @@ -848,11 +844,9 @@ func TestPreparedQuery_Get(t *testing.T) { body := bytes.NewBuffer(nil) req, _ := http.NewRequest("GET", "/v1/query/f004177f-2c28-83b7-4229-eacc25fe55d1", body) resp := httptest.NewRecorder() - if _, err := a.srv.PreparedQuerySpecific(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 404 { - t.Fatalf("bad code: %d", resp.Code) + _, err := a.srv.PreparedQuerySpecific(resp, req) + if err, ok := err.(NotFoundError); !ok { + t.Fatalf("Expected not found error but got %v", err) } }) } diff --git a/agent/session_endpoint.go b/agent/session_endpoint.go index 9371bf7418..afe3faa3c4 100644 --- a/agent/session_endpoint.go +++ b/agent/session_endpoint.go @@ -40,9 +40,7 @@ func (s *HTTPHandlers) SessionCreate(resp http.ResponseWriter, req *http.Request // Handle optional request body if req.ContentLength > 0 { if err := s.rewordUnknownEnterpriseFieldError(lib.DecodeJSON(req.Body, &args.Session)); err != nil { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Request decode failed: %v", err) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Request decode failed: %v", err)} } } @@ -77,9 +75,7 @@ func (s *HTTPHandlers) SessionDestroy(resp http.ResponseWriter, req *http.Reques return nil, err } if args.Session.ID == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing session") - return nil, nil + return nil, BadRequestError{Reason: "Missing session"} } var out string @@ -107,18 +103,14 @@ func (s *HTTPHandlers) SessionRenew(resp http.ResponseWriter, req *http.Request) } args.Session = args.SessionID if args.SessionID == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing session") - return nil, nil + return nil, BadRequestError{Reason: "Missing session"} } var out structs.IndexedSessions if err := s.agent.RPC("Session.Renew", &args, &out); err != nil { return nil, err } else if out.Sessions == nil { - resp.WriteHeader(http.StatusNotFound) - fmt.Fprintf(resp, "Session id '%s' not found", args.SessionID) - return nil, nil + return nil, NotFoundError{Reason: fmt.Sprintf("Session id '%s' not found", args.SessionID)} } return out.Sessions, nil @@ -142,9 +134,7 @@ func (s *HTTPHandlers) SessionGet(resp http.ResponseWriter, req *http.Request) ( } args.Session = args.SessionID if args.SessionID == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing session") - return nil, nil + return nil, BadRequestError{Reason: "Missing session"} } var out structs.IndexedSessions @@ -200,9 +190,7 @@ func (s *HTTPHandlers) SessionsForNode(resp http.ResponseWriter, req *http.Reque return nil, err } if args.Node == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing node name") - return nil, nil + return nil, BadRequestError{Reason: "Missing node name"} } var out structs.IndexedSessions diff --git a/agent/structs/acl.go b/agent/structs/acl.go index 756cadbb1b..42fa558215 100644 --- a/agent/structs/acl.go +++ b/agent/structs/acl.go @@ -89,8 +89,8 @@ var ACLBootstrapNotAllowedErr = errors.New("ACL bootstrap no longer allowed") var ACLBootstrapInvalidResetIndexErr = errors.New("Invalid ACL bootstrap reset index") type ACLIdentity interface { - // ID returns a string that can be used for logging and telemetry. This should not - // contain any secret data used for authentication + // ID returns the accessor ID, a string that can be used for logging and + // telemetry. It is not the secret ID used for authentication. ID() string SecretToken() string PolicyIDs() []string diff --git a/agent/txn_endpoint.go b/agent/txn_endpoint.go index f954ace410..58a1cd4b0f 100644 --- a/agent/txn_endpoint.go +++ b/agent/txn_endpoint.go @@ -63,7 +63,7 @@ func isWrite(op api.KVOp) bool { // internal RPC format. This returns a count of the number of write ops, and // a boolean, that if false means an error response has been generated and // processing should stop. -func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) (structs.TxnOps, int, bool) { +func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) (structs.TxnOps, int, error) { // The TxnMaxReqLen limit and KVMaxValueSize limit both default to the // suggested raft data size and can be configured independently. The // TxnMaxReqLen is enforced on the cumulative size of the transaction, @@ -87,13 +87,10 @@ func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) ( // Check Content-Length first before decoding to return early if req.ContentLength > maxTxnLen { - resp.WriteHeader(http.StatusRequestEntityTooLarge) - fmt.Fprintf(resp, - "Request body(%d bytes) too large, max size: %d bytes. See %s.", - req.ContentLength, maxTxnLen, - "https://www.consul.io/docs/agent/options.html#txn_max_req_len", - ) - return nil, 0, false + return nil, 0, EntityTooLargeError{ + Reason: fmt.Sprintf("Request body(%d bytes) too large, max size: %d bytes. See %s.", + req.ContentLength, maxTxnLen, "https://www.consul.io/docs/agent/options.html#txn_max_req_len"), + } } var ops api.TxnOps @@ -102,30 +99,24 @@ func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) ( if err.Error() == "http: request body too large" { // The request size is also verified during decoding to double check // if the Content-Length header was not set by the client. - resp.WriteHeader(http.StatusRequestEntityTooLarge) - fmt.Fprintf(resp, - "Request body too large, max size: %d bytes. See %s.", - maxTxnLen, - "https://www.consul.io/docs/agent/options.html#txn_max_req_len", - ) + return nil, 0, EntityTooLargeError{ + Reason: fmt.Sprintf("Request body too large, max size: %d bytes. See %s.", + maxTxnLen, "https://www.consul.io/docs/agent/options.html#txn_max_req_len"), + } } else { // Note the body is in API format, and not the RPC format. If we can't // decode it, we will return a 400 since we don't have enough context to // associate the error with a given operation. - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Failed to parse body: %v", err) + return nil, 0, BadRequestError{Reason: fmt.Sprintf("Failed to parse body: %v", err)} } - return nil, 0, false } // Enforce a reasonable upper limit on the number of operations in a // transaction in order to curb abuse. if size := len(ops); size > maxTxnOps { - resp.WriteHeader(http.StatusRequestEntityTooLarge) - fmt.Fprintf(resp, "Transaction contains too many operations (%d > %d)", - size, maxTxnOps) - - return nil, 0, false + return nil, 0, EntityTooLargeError{ + Reason: fmt.Sprintf("Transaction contains too many operations (%d > %d)", size, maxTxnOps), + } } // Convert the KV API format into the RPC format. Note that fixupKVOps @@ -138,9 +129,9 @@ func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) ( case in.KV != nil: size := len(in.KV.Value) if int64(size) > kvMaxValueSize { - resp.WriteHeader(http.StatusRequestEntityTooLarge) - fmt.Fprintf(resp, "Value for key %q is too large (%d > %d bytes)", in.KV.Key, size, s.agent.config.KVMaxValueSize) - return nil, 0, false + return nil, 0, EntityTooLargeError{ + Reason: fmt.Sprintf("Value for key %q is too large (%d > %d bytes)", in.KV.Key, size, s.agent.config.KVMaxValueSize), + } } verb := in.KV.Verb @@ -297,7 +288,7 @@ func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) ( } } - return opsRPC, writes, true + return opsRPC, writes, nil } // Txn handles requests to apply multiple operations in a single, atomic @@ -306,9 +297,9 @@ func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) ( // and everything else will be routed through Raft like a normal write. func (s *HTTPHandlers) Txn(resp http.ResponseWriter, req *http.Request) (interface{}, error) { // Convert the ops from the API format to the internal format. - ops, writes, ok := s.convertOps(resp, req) - if !ok { - return nil, nil + ops, writes, err := s.convertOps(resp, req) + if err != nil { + return nil, err } // Fast-path a transaction with only writes to the read-only endpoint, diff --git a/agent/txn_endpoint_test.go b/agent/txn_endpoint_test.go index 6b3a7c4680..2f9d6fbca1 100644 --- a/agent/txn_endpoint_test.go +++ b/agent/txn_endpoint_test.go @@ -30,13 +30,12 @@ func TestTxnEndpoint_Bad_JSON(t *testing.T) { buf := bytes.NewBuffer([]byte("{")) req, _ := http.NewRequest("PUT", "/v1/txn", buf) resp := httptest.NewRecorder() - if _, err := a.srv.Txn(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 400 { - t.Fatalf("expected 400, got %d", resp.Code) + _, err := a.srv.Txn(resp, req) + err, ok := err.(BadRequestError) + if !ok { + t.Fatalf("expected bad request error but got %v", err) } - if !bytes.Contains(resp.Body.Bytes(), []byte("Failed to parse")) { + if !strings.Contains(err.Error(), "Failed to parse") { t.Fatalf("expected conflicting args error") } } @@ -63,14 +62,12 @@ func TestTxnEndpoint_Bad_Size_Item(t *testing.T) { `, value))) req, _ := http.NewRequest("PUT", "/v1/txn", buf) resp := httptest.NewRecorder() - if _, err := agent.srv.Txn(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 413 && !wantPass { - t.Fatalf("expected 413, got %d", resp.Code) + _, err := agent.srv.Txn(resp, req) + if err, ok := err.(EntityTooLargeError); !ok && !wantPass { + t.Fatalf("expected too large error but got %v", err) } - if resp.Code != 200 && wantPass { - t.Fatalf("expected 200, got %d", resp.Code) + if err != nil && wantPass { + t.Fatalf("err: %v", err) } } @@ -140,14 +137,12 @@ func TestTxnEndpoint_Bad_Size_Net(t *testing.T) { `, value, value, value))) req, _ := http.NewRequest("PUT", "/v1/txn", buf) resp := httptest.NewRecorder() - if _, err := agent.srv.Txn(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 413 && !wantPass { - t.Fatalf("expected 413, got %d", resp.Code) + _, err := agent.srv.Txn(resp, req) + if err, ok := err.(EntityTooLargeError); !ok && !wantPass { + t.Fatalf("expected too large error but got %v", err) } - if resp.Code != 200 && wantPass { - t.Fatalf("expected 200, got %d", resp.Code) + if err != nil && wantPass { + t.Fatalf("err: %v", err) } } @@ -209,11 +204,9 @@ func TestTxnEndpoint_Bad_Size_Ops(t *testing.T) { `, strings.Repeat(`{ "KV": { "Verb": "get", "Key": "key" } },`, 2*maxTxnOps)))) req, _ := http.NewRequest("PUT", "/v1/txn", buf) resp := httptest.NewRecorder() - if _, err := a.srv.Txn(resp, req); err != nil { - t.Fatalf("err: %v", err) - } - if resp.Code != 413 { - t.Fatalf("expected 413, got %d", resp.Code) + _, err := a.srv.Txn(resp, req) + if err, ok := err.(EntityTooLargeError); !ok { + t.Fatalf("expected too large error but got %v", err) } } diff --git a/agent/ui_endpoint.go b/agent/ui_endpoint.go index 4c6b3e7686..56de071c08 100644 --- a/agent/ui_endpoint.go +++ b/agent/ui_endpoint.go @@ -139,9 +139,7 @@ func (s *HTTPHandlers) UINodeInfo(resp http.ResponseWriter, req *http.Request) ( return nil, err } if args.Node == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing node name") - return nil, nil + return nil, BadRequestError{Reason: "Missing node name"} } // Make the RPC request @@ -255,9 +253,7 @@ func (s *HTTPHandlers) UIGatewayServicesNodes(resp http.ResponseWriter, req *htt return nil, err } if args.ServiceName == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing gateway name") - return nil, nil + return nil, BadRequestError{Reason: "Missing gateway name"} } // Make the RPC request @@ -301,16 +297,12 @@ func (s *HTTPHandlers) UIServiceTopology(resp http.ResponseWriter, req *http.Req return nil, err } if args.ServiceName == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing service name") - return nil, nil + return nil, BadRequestError{Reason: "Missing service name"} } kind, ok := req.URL.Query()["kind"] if !ok { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing service kind") - return nil, nil + return nil, BadRequestError{Reason: "Missing service kind"} } args.ServiceKind = structs.ServiceKind(kind[0]) @@ -318,9 +310,7 @@ func (s *HTTPHandlers) UIServiceTopology(resp http.ResponseWriter, req *http.Req case structs.ServiceKindTypical, structs.ServiceKindIngressGateway: // allowed default: - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(resp, "Unsupported service kind %q", args.ServiceKind) - return nil, nil + return nil, BadRequestError{Reason: fmt.Sprintf("Unsupported service kind %q", args.ServiceKind)} } // Make the RPC request @@ -584,9 +574,7 @@ func (s *HTTPHandlers) UIGatewayIntentions(resp http.ResponseWriter, req *http.R return nil, err } if name == "" { - resp.WriteHeader(http.StatusBadRequest) - fmt.Fprint(resp, "Missing gateway name") - return nil, nil + return nil, BadRequestError{Reason: "Missing gateway name"} } args.Match = &structs.IntentionQueryMatch{ Type: structs.IntentionMatchDestination, diff --git a/agent/ui_endpoint_test.go b/agent/ui_endpoint_test.go index 84cd971a7a..757975bc5c 100644 --- a/agent/ui_endpoint_test.go +++ b/agent/ui_endpoint_test.go @@ -1409,14 +1409,15 @@ func TestUIServiceTopology(t *testing.T) { retry.Run(t, func(r *retry.R) { resp := httptest.NewRecorder() obj, err := a.srv.UIServiceTopology(resp, tc.httpReq) - assert.Nil(r, err) if tc.wantErr != "" { + assert.NotNil(r, err) assert.Nil(r, tc.want) // should not define a non-nil want - require.Equal(r, tc.wantErr, resp.Body.String()) + require.Contains(r, err.Error(), tc.wantErr) require.Nil(r, obj) return } + assert.Nil(r, err) require.NoError(r, checkIndex(resp)) require.NotNil(r, obj) diff --git a/build-support/functions/20-build.sh b/build-support/functions/20-build.sh index 7ce6d332c4..f878fb79eb 100644 --- a/build-support/functions/20-build.sh +++ b/build-support/functions/20-build.sh @@ -326,8 +326,7 @@ function build_consul { -e CGO_ENABLED=0 \ -e GOLDFLAGS="${GOLDFLAGS}" \ -e GOTAGS="${GOTAGS}" \ - ${image_name} \ - ./build-support/scripts/build-local.sh -o "${XC_OS}" -a "${XC_ARCH}") + ${image_name} make linux ret=$? if test $ret -eq 0 @@ -354,110 +353,3 @@ function build_consul { popd > /dev/null return $ret } - -function build_consul_local { - # Arguments: - # $1 - Path to the top level Consul source - # $2 - Space separated string of OSes to build. If empty will use env vars for determination. - # $3 - Space separated string of architectures to build. If empty will use env vars for determination. - # $4 - Subdirectory to put binaries in under pkg/bin (optional) - # - # Returns: - # 0 - success - # * - error - # - # Note: - # The GOLDFLAGS and GOTAGS environment variables will be used if set - # If the CONSUL_DEV environment var is truthy only the local platform/architecture is built. - # If the XC_OS or the XC_ARCH environment vars are present then only those platforms/architectures - # will be built. Otherwise all supported platform/architectures are built - # The GOXPARALLEL environment variable is used if set - - if ! test -d "$1" - then - err "ERROR: '$1' is not a directory. build_consul must be called with the path to the top level source as the first argument'" - return 1 - fi - - local sdir="$1" - local build_os="$2" - local build_arch="$3" - local extra_dir_name="$4" - local extra_dir="" - - if test -n "${extra_dir_name}" - then - extra_dir="${extra_dir_name}/" - fi - - pushd ${sdir} > /dev/null - if is_set "${CONSUL_DEV}" - then - if test -z "${XC_OS}" - then - XC_OS=$(go env GOOS) - fi - - if test -z "${XC_ARCH}" - then - XC_ARCH=$(go env GOARCH) - fi - fi - XC_OS=${XC_OS:-"solaris darwin freebsd linux windows"} - XC_ARCH=${XC_ARCH:-"386 amd64 arm arm64"} - - if test -z "${build_os}" - then - build_os="${XC_OS}" - fi - - if test -z "${build_arch}" - then - build_arch="${XC_ARCH}" - fi - - status_stage "==> Building Consul - OSes: ${build_os}, Architectures: ${build_arch}" - mkdir pkg.bin.new 2> /dev/null - - status "Building sequentially with go install" - for os in ${build_os} - do - for arch in ${build_arch} - do - outdir="pkg.bin.new/${extra_dir}${os}_${arch}" - osarch="${os}/${arch}" - - if ! supported_osarch "${osarch}" - then - continue - fi - echo "---> ${osarch}" - - mkdir -p "${outdir}" - GOBIN_EXTRA="" - if test "${os}" != "$(go env GOHOSTOS)" -o "${arch}" != "$(go env GOHOSTARCH)" - then - GOBIN_EXTRA="${os}_${arch}/" - fi - binname="consul" - if [ $os == "windows" ];then - binname="consul.exe" - fi - debug_run env CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go install -ldflags "${GOLDFLAGS}" -tags "${GOTAGS}" && cp "${MAIN_GOPATH}/bin/${GOBIN_EXTRA}${binname}" "${outdir}/${binname}" - if test $? -ne 0 - then - err "ERROR: Failed to build Consul for ${osarch}" - rm -r pkg.bin.new - return 1 - fi - done - done - - build_consul_post "${sdir}" "${extra_dir_name}" - if test $? -ne 0 - then - err "ERROR: Failed postprocessing Consul binaries" - return 1 - fi - return 0 -} diff --git a/build-support/scripts/build-local.sh b/build-support/scripts/build-local.sh deleted file mode 100755 index 45f33282d3..0000000000 --- a/build-support/scripts/build-local.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/bash -SCRIPT_NAME="$(basename ${BASH_SOURCE[0]})" -pushd $(dirname ${BASH_SOURCE[0]}) > /dev/null -SCRIPT_DIR=$(pwd) -pushd ../.. > /dev/null -SOURCE_DIR=$(pwd) -popd > /dev/null -pushd ../functions > /dev/null -FN_DIR=$(pwd) -popd > /dev/null -popd > /dev/null - -source "${SCRIPT_DIR}/functions.sh" - -function usage { -cat <<-EOF -Usage: ${SCRIPT_NAME} [] - -Description: - This script will build the Consul binary on the local system. - All the requisite tooling must be installed for this to be - successful. - -Options: - - -s | --source DIR Path to source to build. - Defaults to "${SOURCE_DIR}" - - -o | --os OSES Space separated string of OS - platforms to build. - - -a | --arch ARCH Space separated string of - architectures to build. - - -h | --help Print this help text. -EOF -} - -function err_usage { - err "$1" - err "" - err "$(usage)" -} - -function main { - declare sdir="${SOURCE_DIR}" - declare build_os="" - declare build_arch="" - - - while test $# -gt 0 - do - case "$1" in - -h | --help ) - usage - return 0 - ;; - -s | --source ) - if test -z "$2" - then - err_usage "ERROR: option -s/--source requires an argument" - return 1 - fi - - if ! test -d "$2" - then - err_usage "ERROR: '$2' is not a directory and not suitable for the value of -s/--source" - return 1 - fi - - sdir="$2" - shift 2 - ;; - -o | --os ) - if test -z "$2" - then - err_usage "ERROR: option -o/--os requires an argument" - return 1 - fi - - build_os="$2" - shift 2 - ;; - -a | --arch ) - if test -z "$2" - then - err_usage "ERROR: option -a/--arch requires an argument" - return 1 - fi - - build_arch="$2" - shift 2 - ;; - * ) - err_usage "ERROR: Unknown argument: '$1'" - return 1 - ;; - esac - done - - build_consul_local "${sdir}" "${build_os}" "${build_arch}" || return 1 - - return 0 -} - -main "$@" -exit $? \ No newline at end of file diff --git a/docs/contributing/add-a-changelog-entry.md b/docs/contributing/add-a-changelog-entry.md new file mode 100644 index 0000000000..4bba2e668e --- /dev/null +++ b/docs/contributing/add-a-changelog-entry.md @@ -0,0 +1,42 @@ +# Adding a Changelog Entry + +Any change that a Consul user might need to know about should have a changelog entry. + +What doesn't need a changelog entry? +- Docs changes +- Typos fixes, unless they are in a public-facing API +- Code changes we are certain no Consul users will need to know about + +To include a [changelog entry](../.changelog) in a PR, commit a text file +named `.changelog/.txt`, where `` is the number associated with the open +PR in Github. The text file should describe the changes in the following format: + +```` +```release-note: +: +``` +```` + +Valid values for `` include: +- `feature`: for the addition of a new feature +- `improvement`: for an improvement (not a bug fix) to an existing feature +- `bug`: for a bug fix +- `security`: for any Common Vulnerabilities and Exposures (CVE) resolutions +- `breaking-change`: for any change that is not fully backwards-compatible +- `deprecation`: for functionality which is now marked for removal in a future release + +`` is meant to categorize the functionality affected by the change. +Some common values are: +- `checks`: related to node or service health checks +- `cli`: related to the command-line interface and its commands +- `config`: related to configuration changes (e.g., adding a new config option) +- `connect`: catch-all for the Connect subsystem that provides service mesh functionality + if no more specific `` applies +- `http`: related to the HTTP API interface and its endpoints +- `dns`: related to DNS functionality +- `ui`: any change related to the built-in Consul UI (`website/` folder) + +Look in the [`.changelog/`](../.changelog) folder for examples of existing changelog entries. + +If a PR deserves multiple changelog entries, just add multiple entries separated by a newline +in the format described above to the `.changelog/.txt` file. diff --git a/docs/contributing/fork-the-project.md b/docs/contributing/fork-the-project.md new file mode 100644 index 0000000000..941c0fe27f --- /dev/null +++ b/docs/contributing/fork-the-project.md @@ -0,0 +1,19 @@ +# Forking the Consul Repo + +Community members wishing to contribute code to Consul must fork the Consul project +(`your-github-username/consul`). Branches pushed to that fork can then be submitted +as pull requests to the upstream project (`hashicorp/consul`). + +To locally clone the repo so that you can pull the latest from the upstream project +(`hashicorp/consul`) and push changes to your own fork (`your-github-username/consul`): + +1. [Create the forked repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo#forking-a-repository) (`your-github-username/consul`) +2. Clone the `hashicorp/consul` repository and `cd` into the folder +3. Make `hashicorp/consul` the `upstream` remote rather than `origin`: + `git remote rename origin upstream`. +4. Add your fork as the `origin` remote. For example: + `git remote add origin https://github.com/myusername/consul` +5. Checkout a feature branch: `git checkout -t -b new-feature` +6. [Make changes](../../.github/CONTRIBUTING.md#modifying-the-code) +7. Push changes to the fork when ready to [submit a PR](../../.github/CONTRIBUTING.md#submitting-a-pull-request): + `git push -u origin new-feature` \ No newline at end of file diff --git a/ui/packages/consul-ui/GNUmakefile b/ui/packages/consul-ui/GNUmakefile index d667f562c6..0855de1dab 100644 --- a/ui/packages/consul-ui/GNUmakefile +++ b/ui/packages/consul-ui/GNUmakefile @@ -5,8 +5,8 @@ all: build deps: ../../node_modules clean +# incase we ever need to clean anything again clean: - rm -rf ./tmp build-staging: deps yarn run build:staging @@ -17,6 +17,9 @@ build-ci: deps build: deps yarn run build +build-debug: + BROCCOLI_DEBUG=* $(MAKE) build + start: deps yarn run start diff --git a/ui/packages/consul-ui/app/components/buttons/skin.scss b/ui/packages/consul-ui/app/components/buttons/skin.scss index d6d36d8297..facc85a208 100644 --- a/ui/packages/consul-ui/app/components/buttons/skin.scss +++ b/ui/packages/consul-ui/app/components/buttons/skin.scss @@ -100,7 +100,6 @@ %sort-button::before { @extend %with-sort-mask, %as-pseudo; position: relative; - top: 4px; width: 16px; height: 16px; } diff --git a/ui/packages/consul-ui/app/components/consul/external-source/index.scss b/ui/packages/consul-ui/app/components/consul/external-source/index.scss index 8cc460f164..b05acb45b2 100644 --- a/ui/packages/consul-ui/app/components/consul/external-source/index.scss +++ b/ui/packages/consul-ui/app/components/consul/external-source/index.scss @@ -1,3 +1,31 @@ .consul-external-source { @extend %pill-200, %frame-gray-600, %p1; } +.consul-external-source.kubernetes::before { + @extend %with-logo-kubernetes-color-icon, %as-pseudo; +} +.consul-external-source.terraform::before { + @extend %with-logo-terraform-color-icon, %as-pseudo; +} +.consul-external-source.nomad::before { + @extend %with-logo-nomad-color-icon, %as-pseudo; +} +.consul-external-source.consul::before, +.consul-external-source.consul-api-gateway::before { + @extend %with-logo-consul-color-icon, %as-pseudo; +} +.consul-external-source.vault::before { + @extend %with-vault-100; +} +.consul-external-source.aws::before { + @extend %with-aws-100; +} +.consul-external-source.leader::before { + @extend %with-star-outline-mask, %as-pseudo; +} +.consul-external-source.jwt::before { + @extend %with-logo-jwt-color-icon, %as-pseudo; +} +.consul-external-source.oidc::before { + @extend %with-logo-oidc-color-icon, %as-pseudo; +} diff --git a/ui/packages/consul-ui/app/components/consul/intention/components.scss b/ui/packages/consul-ui/app/components/consul/intention/components.scss index 59dfcd2fea..ed98c84994 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/components.scss +++ b/ui/packages/consul-ui/app/components/consul/intention/components.scss @@ -1,9 +1,7 @@ %pill-allow::before, %pill-deny::before, %pill-l7::before { - @extend %as-pseudo; margin-right: 5px; - font-size: 0.9em; } %pill-allow, %pill-deny, @@ -24,11 +22,11 @@ @extend %frame-gray-900; } %pill-allow::before { - @extend %with-arrow-right-mask; + @extend %with-allow-300; } %pill-deny::before { - @extend %with-deny-color-mask; + @extend %with-deny-300; } %pill-l7::before { - @extend %with-layers-mask; + @extend %with-l7-300; } diff --git a/ui/packages/consul-ui/app/components/consul/intention/form/fieldsets/skin.scss b/ui/packages/consul-ui/app/components/consul/intention/form/fieldsets/skin.scss index 5057fc0420..242b593b0c 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/form/fieldsets/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/intention/form/fieldsets/skin.scss @@ -1,12 +1,11 @@ .consul-intention-fieldsets { .value-allow > :last-child::before { - @extend %with-arrow-right-mask, %as-pseudo; - color: rgb(var(--tone-green-500)); + @extend %with-allow-500; } .value-deny > :last-child::before { - @extend %with-deny-color-icon, %as-pseudo; + @extend %with-deny-500; } .value- > :last-child::before { - @extend %with-layers-mask, %as-pseudo; + @extend %with-l7-500; } } diff --git a/ui/packages/consul-ui/app/components/pill/index.scss b/ui/packages/consul-ui/app/components/pill/index.scss index 1ad95dfe86..f5a7642f2c 100644 --- a/ui/packages/consul-ui/app/components/pill/index.scss +++ b/ui/packages/consul-ui/app/components/pill/index.scss @@ -20,31 +20,3 @@ span.policy-node-identity::before { span.policy-service-identity::before { content: 'Service Identity: '; } -%pill.kubernetes::before { - @extend %with-logo-kubernetes-color-icon, %as-pseudo; -} -%pill.terraform::before { - @extend %with-logo-terraform-color-icon, %as-pseudo; -} -%pill.nomad::before { - @extend %with-logo-nomad-color-icon, %as-pseudo; -} -%pill.consul::before, -%pill.consul-api-gateway::before { - @extend %with-logo-consul-color-icon, %as-pseudo; -} -%pill.vault::before { - @extend %with-vault-300; -} -%pill.aws::before { - @extend %with-logo-aws-color-icon, %as-pseudo; -} -%pill.leader::before { - @extend %with-star-outline-mask, %as-pseudo; -} -%pill.jwt::before { - @extend %with-logo-jwt-color-icon, %as-pseudo; -} -%pill.oidc::before { - @extend %with-logo-oidc-color-icon, %as-pseudo; -} diff --git a/ui/packages/consul-ui/app/components/pill/layout.scss b/ui/packages/consul-ui/app/components/pill/layout.scss index 6b63f13d69..60b15f82ba 100644 --- a/ui/packages/consul-ui/app/components/pill/layout.scss +++ b/ui/packages/consul-ui/app/components/pill/layout.scss @@ -6,7 +6,8 @@ } %pill::before { margin-right: 4px; - font-size: 0.8em; + width: 0.75rem !important; /* 12px */ + height: 0.75rem !important; /* 12px */ } %pill-200 { @extend %pill; diff --git a/ui/packages/consul-ui/app/components/popover-select/index.scss b/ui/packages/consul-ui/app/components/popover-select/index.scss index a4fc7df8e9..badd21eb43 100644 --- a/ui/packages/consul-ui/app/components/popover-select/index.scss +++ b/ui/packages/consul-ui/app/components/popover-select/index.scss @@ -50,7 +50,7 @@ color: rgb(var(--tone-gray-500)); } %popover-select .aws button::before { - @extend %with-logo-aws-color-icon, %as-pseudo; + @extend %with-aws-300; } %popover-select .kubernetes button::before { @extend %with-logo-kubernetes-color-icon, %as-pseudo; diff --git a/ui/packages/consul-ui/app/helpers/adopt-styles.js b/ui/packages/consul-ui/app/helpers/adopt-styles.js new file mode 100644 index 0000000000..4fd10a71bc --- /dev/null +++ b/ui/packages/consul-ui/app/helpers/adopt-styles.js @@ -0,0 +1,18 @@ +import Helper from '@ember/component/helper'; +import { assert } from '@ember/debug'; +import { adoptStyles } from '@lit/reactive-element'; + +export default class AdoptStylesHelper extends Helper { + /** + * Adopt/apply given styles to a `ShadowRoot` using constructable styleSheets if supported + * + * @param {[ShadowRoot, CSSResultGroup]} params + */ + compute([$shadow, styles], hash) { + assert( + 'adopt-styles can only be used to apply styles to ShadowDOM elements', + $shadow instanceof ShadowRoot + ); + adoptStyles($shadow, [styles]); + } +} diff --git a/ui/packages/consul-ui/app/helpers/adopt-styles.mdx b/ui/packages/consul-ui/app/helpers/adopt-styles.mdx new file mode 100644 index 0000000000..b2d09331bb --- /dev/null +++ b/ui/packages/consul-ui/app/helpers/adopt-styles.mdx @@ -0,0 +1,28 @@ +# adopt-styles + +Adopt/apply given styles to a `ShadowRoot` using constructable styleSheets if supported + +```hbs preview-template +
+ {{#if this.shadow}} + {{#in-element this.shadow}} + {{adopt-styles this.shadow (css ' + :host { + background-color: red; + width: 100px; + height: 100px; + } + ')}} + {{/in-element}} + {{/if}} +
+``` + +## Positional Arguments + +| Argument | Type | Default | Description | +| --- | --- | --- | --- | +| `params` | `[ShadowRoot, CSSResultGroup]` | | | + diff --git a/ui/packages/consul-ui/app/helpers/css.js b/ui/packages/consul-ui/app/helpers/css.js new file mode 100644 index 0000000000..35bb4aabad --- /dev/null +++ b/ui/packages/consul-ui/app/helpers/css.js @@ -0,0 +1,8 @@ +import Helper from '@ember/component/helper'; +import { css } from '@lit/reactive-element'; + +export default class ConsoleLogHelper extends Helper { + compute([str], hash) { + return css([str]); + } +} diff --git a/ui/packages/consul-ui/app/helpers/style-map.js b/ui/packages/consul-ui/app/helpers/style-map.js new file mode 100644 index 0000000000..259effd1e1 --- /dev/null +++ b/ui/packages/consul-ui/app/helpers/style-map.js @@ -0,0 +1,22 @@ +import { helper } from '@ember/component/helper'; + +/** + * Conditionally maps styles to a string ready for typical DOM + * usage (i.e. semi-colon delimited) + * + * @typedef {([string, (string | undefined), string] | [string, (string | undefined)])} styleInfo + * @param {styleInfo[]} entries - An array of `styleInfo`s to map + * @param {boolean} transform=true - whether to perform the build-time 'helper + * to modifier' transpilation. Note a transpiler needs installing separately. + */ +const styleMap = (entries, transform = true) => { + const str = entries.reduce((prev, [prop, value, unit = '']) => { + if (value == null) { + return prev; + } + return `${prev}${prop}:${value.toString()}${unit};`; + }, ''); + return str.length > 0 ? str : undefined; +}; + +export default helper(styleMap); diff --git a/ui/packages/consul-ui/app/helpers/style-map.mdx b/ui/packages/consul-ui/app/helpers/style-map.mdx new file mode 100644 index 0000000000..cb7fb6362b --- /dev/null +++ b/ui/packages/consul-ui/app/helpers/style-map.mdx @@ -0,0 +1,58 @@ +# style-map + +`{{style-map}}` is used to easily add a list of styles, conditionally, and +have them all formatted nicely to be printed in a DOM `style` attribute. + +As well as an entry-like array you can also pass an additional `unit` property +as the 3rd item in the array. This is to make it easier to do mathamatical +calculations for units without having to use `(concat)`. + +If any property has a value of `null` or `undefined`, that style property will +not be included in the resulting string. + +```hbs preview-template +
+
+ This div has the correct style added/omitted. +
+
+ + style={{style-map + (array 'outline' '1px solid red') + (array 'width' '600px') + (array 'height' 100 'px') + (array 'padding' 1 'rem') + (array 'background' null) + }} + +
+
+``` + +## Positional Arguments + +| Argument | Type | Default | Description | +| --- | --- | --- | --- | +| `entries` | `styleInfo[]` | | An array of `styleInfo`s to map | + +## Named Arguments + +| Argument | Type | Default | Description | +| --- | --- | --- | --- | +| `transform` | `boolean` | true | whether to perform the build-time 'helper to modifier' transpilation | + +## Types + +| Type | Default | Description | +| --- | --- | --- | +| `styleInfo` | `([string, (string \| undefined), string] \| [string, (string \| undefined)])` | | + + diff --git a/ui/packages/consul-ui/app/modifiers/attach-shadow.js b/ui/packages/consul-ui/app/modifiers/attach-shadow.js new file mode 100644 index 0000000000..94901c67d6 --- /dev/null +++ b/ui/packages/consul-ui/app/modifiers/attach-shadow.js @@ -0,0 +1,23 @@ +import { setModifierManager, capabilities } from '@ember/modifier'; + +export default setModifierManager( + () => ({ + capabilities: capabilities('3.13', { disableAutoTracking: true }), + + createModifier() {}, + + installModifier(_state, element, { positional: [fn, ...args], named }) { + let shadow; + try { + shadow = element.attachShadow({ mode: 'open' }); + } catch (e) { + // shadow = false; + console.error(e); + } + fn(shadow); + }, + updateModifier() {}, + destroyModifier() {}, + }), + class CustomElementModifier {} +); diff --git a/ui/packages/consul-ui/app/modifiers/attach-shadow.mdx b/ui/packages/consul-ui/app/modifiers/attach-shadow.mdx new file mode 100644 index 0000000000..3e973665ca --- /dev/null +++ b/ui/packages/consul-ui/app/modifiers/attach-shadow.mdx @@ -0,0 +1,28 @@ +# attach-shadow + +`{{attach-shadow (set this 'shadow')}}` attaches a `ShadowRoot` to the modified DOM element +and pass a reference to that `ShadowRoot` to the setter function. + + +Please note: This should be used as a utility modifier for when having access +to the shadow DOM is handy, not really for building full blown shadow DOM +based Web Components. + +```hbs preview-template +
+ {{#if this.shadow}} + {{#in-element this.shadow}} + + {{/in-element}} + {{/if}} +

Hello from the shadows!

+
+``` + +## Positional Arguments + +| Argument | Type | Default | Description | +| --- | --- | --- | --- | +| `setter` | `function` | | Usually `set` or `mut` or similar | diff --git a/ui/packages/consul-ui/app/modifiers/on-outside.js b/ui/packages/consul-ui/app/modifiers/on-outside.js new file mode 100644 index 0000000000..fe32dee5ac --- /dev/null +++ b/ui/packages/consul-ui/app/modifiers/on-outside.js @@ -0,0 +1,45 @@ +import Modifier from 'ember-modifier'; +import { action } from '@ember/object'; +import { inject as service } from '@ember/service'; + +export default class OnOutsideModifier extends Modifier { + @service('dom') dom; + + constructor() { + super(...arguments); + this.doc = this.dom.document(); + } + async connect(params, options) { + await new Promise(resolve => setTimeout(resolve, 0)); + try { + this.doc.addEventListener(params[0], this.listen); + } catch (e) { + // continue + } + } + + @action + listen(e) { + if (this.dom.isOutside(this.element, e.target)) { + const dispatch = typeof this.params[1] === 'function' ? this.params[1] : _ => {}; + dispatch.apply(this.element, [e]); + } + } + + disconnect() { + this.doc.removeEventListener('click', this.listen); + } + + didReceiveArguments() { + this.params = this.args.positional; + this.options = this.args.named; + } + + didInstall() { + this.connect(this.args.positional, this.args.named); + } + + willRemove() { + this.disconnect(); + } +} diff --git a/ui/packages/consul-ui/app/modifiers/on-outside.mdx b/ui/packages/consul-ui/app/modifiers/on-outside.mdx new file mode 100644 index 0000000000..325091b99e --- /dev/null +++ b/ui/packages/consul-ui/app/modifiers/on-outside.mdx @@ -0,0 +1,22 @@ +# on-outside + +`{{on-outside 'click' (fn @callback}}` works similarly to `{{on }}` but allows +you to attach handlers that is specifically not the currently modified +element. + +```hbs preview-template + +``` + +## Positional Arguments + +| Argument | Type | Default | Description | +| --- | --- | --- | --- | +| `event` | `string` | | Name of the event to listen for | +| `handler` | `function` | | Function to handle the event | diff --git a/ui/packages/consul-ui/app/styles/app.scss b/ui/packages/consul-ui/app/styles/app.scss index 3834601dc0..c2ee814d83 100644 --- a/ui/packages/consul-ui/app/styles/app.scss +++ b/ui/packages/consul-ui/app/styles/app.scss @@ -15,3 +15,6 @@ @import 'icons'; /* global control of themeable components */ @import 'themes'; +/* debug only, this is empty during a production build */ +/* but uses the contents of ./debug.scss during dev */ +@import '_debug'; diff --git a/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss b/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss index c659f53745..e15efe3aa5 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss @@ -1,3 +1,11 @@ +%theme-light { + --theme-dark-none: ; + --theme-light-none: initial; +} +%theme-dark { + --theme-dark-none: initial; + --theme-light-none: ; +} %with-icon { background-repeat: no-repeat; background-position: center; @@ -20,8 +28,8 @@ content: ''; visibility: visible; background-size: contain; - width: 1.2em; - height: 1.2em; + width: 1rem; /* 16px */ + height: 1rem; /* 16px */ vertical-align: text-top; } %led-icon { diff --git a/ui/packages/consul-ui/app/styles/base/icons/base-variables.scss b/ui/packages/consul-ui/app/styles/base/icons/base-variables.scss index 70a4e386e6..6be0782563 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/base-variables.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/base-variables.scss @@ -1,893 +1,949 @@ %activity-16-svg-prop { - --activity-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --activity-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %activity-24-svg-prop { - --activity-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --activity-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-circle-16-svg-prop { - --alert-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-circle-24-svg-prop { - --alert-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-circle-fill-16-svg-prop { - --alert-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-circle-fill-24-svg-prop { - --alert-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-circle-fill-svg-prop { - --alert-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %alert-circle-16-svg-prop; } %alert-circle-outline-svg-prop { - --alert-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %alert-circle-16-svg-prop; } %alert-octagon-16-svg-prop { - --alert-octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-octagon-24-svg-prop { - --alert-octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-octagon-fill-16-svg-prop { - --alert-octagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-octagon-fill-24-svg-prop { - --alert-octagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-triangle-16-svg-prop { - --alert-triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-triangle-24-svg-prop { - --alert-triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-triangle-fill-16-svg-prop { - --alert-triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-triangle-fill-24-svg-prop { - --alert-triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alert-triangle-svg-prop { - --alert-triangle-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %alert-triangle-16-svg-prop; } %alibaba-16-svg-prop { - --alibaba-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alibaba-24-svg-prop { - --alibaba-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alibaba-color-16-svg-prop { - --alibaba-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %alibaba-color-24-svg-prop { - --alibaba-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-center-16-svg-prop { - --align-center-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-center-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-center-24-svg-prop { - --align-center-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-center-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-justify-16-svg-prop { - --align-justify-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-justify-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-justify-24-svg-prop { - --align-justify-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-justify-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-left-16-svg-prop { - --align-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-left-24-svg-prop { - --align-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-right-16-svg-prop { - --align-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %align-right-24-svg-prop { - --align-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%amazon-eks-16-svg-prop { + --amazon-eks-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%amazon-eks-24-svg-prop { + --amazon-eks-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%amazon-eks-color-16-svg-prop { + --amazon-eks-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%amazon-eks-color-24-svg-prop { + --amazon-eks-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %apple-16-svg-prop { - --apple-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %apple-24-svg-prop { - --apple-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %apple-color-16-svg-prop { - --apple-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %apple-color-24-svg-prop { - --apple-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %archive-16-svg-prop { - --archive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --archive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %archive-24-svg-prop { - --archive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --archive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-16-svg-prop { - --arrow-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-24-svg-prop { - --arrow-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-circle-16-svg-prop { - --arrow-down-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-circle-24-svg-prop { - --arrow-down-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-left-16-svg-prop { - --arrow-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-left-24-svg-prop { - --arrow-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-right-16-svg-prop { - --arrow-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-right-24-svg-prop { - --arrow-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-down-svg-prop { - --arrow-down-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %arrow-down-16-svg-prop; } %arrow-left-16-svg-prop { - --arrow-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-left-24-svg-prop { - --arrow-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-left-circle-16-svg-prop { - --arrow-left-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-left-circle-24-svg-prop { - --arrow-left-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-left-svg-prop { - --arrow-left-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %arrow-left-16-svg-prop; } %arrow-right-16-svg-prop { - --arrow-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-right-24-svg-prop { - --arrow-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-right-circle-16-svg-prop { - --arrow-right-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-right-circle-24-svg-prop { - --arrow-right-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-right-svg-prop { - --arrow-right-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %arrow-right-16-svg-prop; } %arrow-up-16-svg-prop { - --arrow-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-24-svg-prop { - --arrow-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-circle-16-svg-prop { - --arrow-up-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-circle-24-svg-prop { - --arrow-up-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-left-16-svg-prop { - --arrow-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-left-24-svg-prop { - --arrow-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-right-16-svg-prop { - --arrow-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-right-24-svg-prop { - --arrow-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %arrow-up-svg-prop { - --arrow-up-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %arrow-up-16-svg-prop; } %at-sign-16-svg-prop { - --at-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --at-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %at-sign-24-svg-prop { - --at-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --at-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %auth0-16-svg-prop { - --auth0-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %auth0-24-svg-prop { - --auth0-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %auth0-color-16-svg-prop { - --auth0-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %auth0-color-24-svg-prop { - --auth0-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %auto-apply-16-svg-prop { - --auto-apply-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auto-apply-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %auto-apply-24-svg-prop { - --auto-apply-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auto-apply-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %award-16-svg-prop { - --award-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --award-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %award-24-svg-prop { - --award-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --award-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %aws-16-svg-prop { - --aws-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %aws-24-svg-prop { - --aws-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %aws-color-16-svg-prop { - --aws-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %aws-color-24-svg-prop { - --aws-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%aws-ec2-16-svg-prop { + --aws-ec2-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%aws-ec2-24-svg-prop { + --aws-ec2-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%aws-ec2-color-16-svg-prop { + --aws-ec2-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%aws-ec2-color-24-svg-prop { + --aws-ec2-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-16-svg-prop { - --azure-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-24-svg-prop { - --azure-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-color-16-svg-prop { - --azure-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-color-24-svg-prop { - --azure-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-devops-16-svg-prop { - --azure-devops-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-devops-24-svg-prop { - --azure-devops-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-devops-color-16-svg-prop { - --azure-devops-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %azure-devops-color-24-svg-prop { - --azure-devops-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%bank-vault-16-svg-prop { + --bank-vault-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%bank-vault-24-svg-prop { + --bank-vault-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bar-chart-16-svg-prop { - --bar-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bar-chart-24-svg-prop { - --bar-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bar-chart-alt-16-svg-prop { - --bar-chart-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bar-chart-alt-24-svg-prop { - --bar-chart-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %battery-16-svg-prop { - --battery-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %battery-24-svg-prop { - --battery-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %battery-charging-16-svg-prop { - --battery-charging-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-charging-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %battery-charging-24-svg-prop { - --battery-charging-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-charging-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %beaker-16-svg-prop { - --beaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --beaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %beaker-24-svg-prop { - --beaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --beaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-16-svg-prop { - --bell-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-24-svg-prop { - --bell-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-active-16-svg-prop { - --bell-active-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-active-24-svg-prop { - --bell-active-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-active-fill-16-svg-prop { - --bell-active-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-active-fill-24-svg-prop { - --bell-active-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-off-16-svg-prop { - --bell-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bell-off-24-svg-prop { - --bell-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bitbucket-16-svg-prop { - --bitbucket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bitbucket-24-svg-prop { - --bitbucket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bitbucket-color-16-svg-prop { - --bitbucket-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bitbucket-color-24-svg-prop { - --bitbucket-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bolt-svg-prop { - --bolt-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %zap-16-svg-prop; } %bookmark-16-svg-prop { - --bookmark-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-24-svg-prop { - --bookmark-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-add-16-svg-prop { - --bookmark-add-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-add-24-svg-prop { - --bookmark-add-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-add-fill-16-svg-prop { - --bookmark-add-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-add-fill-24-svg-prop { - --bookmark-add-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-fill-16-svg-prop { - --bookmark-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-fill-24-svg-prop { - --bookmark-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-remove-16-svg-prop { - --bookmark-remove-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-remove-24-svg-prop { - --bookmark-remove-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-remove-fill-16-svg-prop { - --bookmark-remove-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bookmark-remove-fill-24-svg-prop { - --bookmark-remove-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bottom-16-svg-prop { - --bottom-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bottom-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bottom-24-svg-prop { - --bottom-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bottom-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%boundary-16-svg-prop { + --boundary-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%boundary-24-svg-prop { + --boundary-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%boundary-color-16-svg-prop { + --boundary-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%boundary-color-24-svg-prop { + --boundary-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %box-16-svg-prop { - --box-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --box-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %box-24-svg-prop { - --box-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --box-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %box-check-fill-svg-prop { - --box-check-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %check-square-fill-16-svg-prop; } %box-outline-svg-prop { - --box-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %square-16-svg-prop; } %briefcase-16-svg-prop { - --briefcase-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --briefcase-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %briefcase-24-svg-prop { - --briefcase-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --briefcase-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %broadcast-svg-prop { - --broadcast-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %radio-16-svg-prop; } %bug-16-svg-prop { - --bug-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bug-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bug-24-svg-prop { - --bug-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bug-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %bug-svg-prop { - --bug-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %bug-16-svg-prop; } %build-16-svg-prop { - --build-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --build-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %build-24-svg-prop { - --build-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --build-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %calendar-16-svg-prop { - --calendar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --calendar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %calendar-24-svg-prop { - --calendar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --calendar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %calendar-svg-prop { - --calendar-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %calendar-16-svg-prop; } %camera-16-svg-prop { - --camera-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %camera-24-svg-prop { - --camera-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %camera-off-16-svg-prop { - --camera-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %camera-off-24-svg-prop { - --camera-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cancel-circle-fill-svg-prop { - --cancel-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %x-circle-fill-16-svg-prop; } %cancel-circle-outline-svg-prop { - --cancel-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %x-circle-16-svg-prop; } %cancel-plain-svg-prop { - --cancel-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %x-16-svg-prop; } %cancel-square-fill-svg-prop { - --cancel-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %x-square-fill-16-svg-prop; } %cancel-square-outline-svg-prop { - --cancel-square-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %x-square-16-svg-prop; } %caret-16-svg-prop { - --caret-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --caret-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %caret-24-svg-prop { - --caret-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --caret-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %caret-down-svg-prop { - --caret-down-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %caret-16-svg-prop; } %caret-up-svg-prop { - --caret-up-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %chevron-up-16-svg-prop; } %cast-16-svg-prop { - --cast-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cast-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cast-24-svg-prop { - --cast-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cast-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %certificate-16-svg-prop { - --certificate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --certificate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %certificate-24-svg-prop { - --certificate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --certificate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %change-16-svg-prop { - --change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %change-24-svg-prop { - --change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %change-circle-16-svg-prop { - --change-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %change-circle-24-svg-prop { - --change-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %change-square-16-svg-prop { - --change-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %change-square-24-svg-prop { - --change-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-16-svg-prop { - --check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-24-svg-prop { - --check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-circle-16-svg-prop { - --check-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-circle-24-svg-prop { - --check-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-circle-fill-16-svg-prop { - --check-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-circle-fill-24-svg-prop { - --check-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-circle-fill-svg-prop { - --check-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %check-circle-fill-16-svg-prop; } %check-circle-outline-svg-prop { - --check-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %check-circle-16-svg-prop; } %check-diamond-16-svg-prop { - --check-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-diamond-24-svg-prop { - --check-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-diamond-fill-16-svg-prop { - --check-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-diamond-fill-24-svg-prop { - --check-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-hexagon-16-svg-prop { - --check-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-hexagon-24-svg-prop { - --check-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-hexagon-fill-16-svg-prop { - --check-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-hexagon-fill-24-svg-prop { - --check-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-plain-svg-prop { - --check-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %check-16-svg-prop; } %check-square-16-svg-prop { - --check-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-square-24-svg-prop { - --check-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-square-fill-16-svg-prop { - --check-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %check-square-fill-24-svg-prop { - --check-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-down-16-svg-prop { - --chevron-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-down-24-svg-prop { - --chevron-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-down-svg-prop { - --chevron-down-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %chevron-down-16-svg-prop; } %chevron-left-16-svg-prop { - --chevron-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-left-24-svg-prop { - --chevron-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-left-svg-prop { - --chevron-left-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %chevron-left-16-svg-prop; } %chevron-right-16-svg-prop { - --chevron-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-right-24-svg-prop { - --chevron-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-right-svg-prop { - --chevron-right-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %chevron-right-16-svg-prop; } %chevron-up-16-svg-prop { - --chevron-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-up-24-svg-prop { - --chevron-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevron-up-svg-prop { - --chevron-up-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %chevron-up-16-svg-prop; } %chevrons-down-16-svg-prop { - --chevrons-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-down-24-svg-prop { - --chevrons-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-left-16-svg-prop { - --chevrons-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-left-24-svg-prop { - --chevrons-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-right-16-svg-prop { - --chevrons-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-right-24-svg-prop { - --chevrons-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-up-16-svg-prop { - --chevrons-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %chevrons-up-24-svg-prop { - --chevrons-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-16-svg-prop { - --circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-24-svg-prop { - --circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-dot-16-svg-prop { - --circle-dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-dot-24-svg-prop { - --circle-dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-fill-16-svg-prop { - --circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-fill-24-svg-prop { - --circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-half-16-svg-prop { - --circle-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %circle-half-24-svg-prop { - --circle-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clipboard-16-svg-prop { - --clipboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clipboard-24-svg-prop { - --clipboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clipboard-checked-16-svg-prop { - --clipboard-checked-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-checked-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clipboard-checked-24-svg-prop { - --clipboard-checked-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-checked-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clipboard-copy-16-svg-prop { - --clipboard-copy-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-copy-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clipboard-copy-24-svg-prop { - --clipboard-copy-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-copy-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clock-16-svg-prop { - --clock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clock-24-svg-prop { - --clock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %clock-fill-svg-prop { - --clock-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %clock-16-svg-prop; } %clock-outline-svg-prop { - --clock-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %clock-16-svg-prop; } %cloud-16-svg-prop { - --cloud-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-24-svg-prop { - --cloud-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-check-16-svg-prop { - --cloud-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-check-24-svg-prop { - --cloud-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-cross-svg-prop { @@ -895,255 +951,287 @@ } %cloud-download-16-svg-prop { - --cloud-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-download-24-svg-prop { - --cloud-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-lightning-16-svg-prop { - --cloud-lightning-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lightning-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-lightning-24-svg-prop { - --cloud-lightning-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lightning-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-lock-16-svg-prop { - --cloud-lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-lock-24-svg-prop { - --cloud-lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-off-16-svg-prop { - --cloud-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-off-24-svg-prop { - --cloud-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-upload-16-svg-prop { - --cloud-upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-upload-24-svg-prop { - --cloud-upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-x-16-svg-prop { - --cloud-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cloud-x-24-svg-prop { - --cloud-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %code-16-svg-prop { - --code-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --code-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %code-24-svg-prop { - --code-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --code-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %code-svg-prop { - --code-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %code-16-svg-prop; +} + +%codepen-16-svg-prop { + --codepen-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%codepen-24-svg-prop { + --codepen-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%codepen-color-16-svg-prop { + --codepen-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%codepen-color-24-svg-prop { + --codepen-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %collections-16-svg-prop { - --collections-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --collections-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %collections-24-svg-prop { - --collections-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --collections-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %command-16-svg-prop { - --command-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --command-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %command-24-svg-prop { - --command-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --command-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %compass-16-svg-prop { - --compass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --compass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %compass-24-svg-prop { - --compass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --compass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %connection-16-svg-prop { - --connection-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %connection-24-svg-prop { - --connection-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %connection-gateway-16-svg-prop { - --connection-gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %connection-gateway-24-svg-prop { - --connection-gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %console-svg-prop { - --console-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %terminal-16-svg-prop; +} + +%consul-16-svg-prop { + --consul-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%consul-24-svg-prop { + --consul-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%consul-color-16-svg-prop { + --consul-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%consul-color-24-svg-prop { + --consul-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %copy-action-svg-prop { - --copy-action-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %clipboard-copy-16-svg-prop; } %copy-success-svg-prop { - --copy-success-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %clipboard-checked-16-svg-prop; } %corner-down-left-16-svg-prop { - --corner-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-down-left-24-svg-prop { - --corner-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-down-right-16-svg-prop { - --corner-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-down-right-24-svg-prop { - --corner-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-left-down-16-svg-prop { - --corner-left-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-left-down-24-svg-prop { - --corner-left-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-left-up-16-svg-prop { - --corner-left-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-left-up-24-svg-prop { - --corner-left-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-right-down-16-svg-prop { - --corner-right-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-right-down-24-svg-prop { - --corner-right-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-right-up-16-svg-prop { - --corner-right-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-right-up-24-svg-prop { - --corner-right-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-up-left-16-svg-prop { - --corner-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-up-left-24-svg-prop { - --corner-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-up-right-16-svg-prop { - --corner-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %corner-up-right-24-svg-prop { - --corner-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cpu-16-svg-prop { - --cpu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cpu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %cpu-24-svg-prop { - --cpu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cpu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %credit-card-16-svg-prop { - --credit-card-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --credit-card-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %credit-card-24-svg-prop { - --credit-card-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --credit-card-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %crop-16-svg-prop { - --crop-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crop-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %crop-24-svg-prop { - --crop-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crop-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %crosshair-16-svg-prop { - --crosshair-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crosshair-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %crosshair-24-svg-prop { - --crosshair-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crosshair-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dashboard-16-svg-prop { - --dashboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dashboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dashboard-24-svg-prop { - --dashboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dashboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %database-16-svg-prop { - --database-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --database-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %database-24-svg-prop { - --database-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --database-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %database-svg-prop { - --database-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %database-16-svg-prop; } %delay-16-svg-prop { - --delay-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delay-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %delay-24-svg-prop { - --delay-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delay-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %delay-svg-prop { - --delay-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %delay-16-svg-prop; } %delete-16-svg-prop { - --delete-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delete-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %delete-24-svg-prop { - --delete-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delete-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %deny-alt-svg-prop { - --deny-alt-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %skip-16-svg-prop; } %deny-color-svg-prop { @@ -1151,1075 +1239,1163 @@ } %deny-default-svg-prop { - --deny-default-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %skip-16-svg-prop; } %diamond-16-svg-prop { - --diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %diamond-24-svg-prop { - --diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %diamond-fill-16-svg-prop { - --diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %diamond-fill-24-svg-prop { - --diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %disabled-svg-prop { - --disabled-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %skip-16-svg-prop; } %disc-16-svg-prop { - --disc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --disc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %disc-24-svg-prop { - --disc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --disc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %discussion-circle-16-svg-prop { - --discussion-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %discussion-circle-24-svg-prop { - --discussion-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %discussion-square-16-svg-prop { - --discussion-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %discussion-square-24-svg-prop { - --discussion-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docker-16-svg-prop { - --docker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docker-24-svg-prop { - --docker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docker-color-16-svg-prop { - --docker-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docker-color-24-svg-prop { - --docker-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-16-svg-prop { - --docs-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-24-svg-prop { - --docs-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-download-16-svg-prop { - --docs-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-download-24-svg-prop { - --docs-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-link-16-svg-prop { - --docs-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-link-24-svg-prop { - --docs-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %docs-svg-prop { - --docs-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %docs-link-16-svg-prop; } %dollar-sign-16-svg-prop { - --dollar-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dollar-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dollar-sign-24-svg-prop { - --dollar-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dollar-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dot-16-svg-prop { - --dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dot-24-svg-prop { - --dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dot-half-16-svg-prop { - --dot-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %dot-half-24-svg-prop { - --dot-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %download-16-svg-prop { - --download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %download-24-svg-prop { - --download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %download-svg-prop { - --download-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %download-16-svg-prop; } %droplet-16-svg-prop { - --droplet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --droplet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %droplet-24-svg-prop { - --droplet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --droplet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %duplicate-16-svg-prop { - --duplicate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --duplicate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %duplicate-24-svg-prop { - --duplicate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --duplicate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %edit-16-svg-prop { - --edit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --edit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %edit-24-svg-prop { - --edit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --edit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %edit-svg-prop { - --edit-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %edit-16-svg-prop; } %entry-point-16-svg-prop { - --entry-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --entry-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %entry-point-24-svg-prop { - --entry-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --entry-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %envelope-sealed-fill-svg-prop { - --envelope-sealed-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %mail-16-svg-prop; } %envelope-sealed-outline-svg-prop { - --envelope-sealed-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %mail-16-svg-prop; } %envelope-unsealed--outline-svg-prop { - --envelope-unsealed--outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %mail-open-16-svg-prop; } %envelope-unsealed-fill-svg-prop { - --envelope-unsealed-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %mail-open-16-svg-prop; } %event-16-svg-prop { - --event-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --event-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %event-24-svg-prop { - --event-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --event-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %exit-point-16-svg-prop { - --exit-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --exit-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %exit-point-24-svg-prop { - --exit-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --exit-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %exit-svg-prop { - --exit-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %external-link-16-svg-prop; } %expand-less-svg-prop { - --expand-less-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %minimize-16-svg-prop; } %expand-more-svg-prop { - --expand-more-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %maximize-16-svg-prop; } %external-link-16-svg-prop { - --external-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --external-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %external-link-24-svg-prop { - --external-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --external-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %eye-16-svg-prop { - --eye-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %eye-24-svg-prop { - --eye-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %eye-off-16-svg-prop { - --eye-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %eye-off-24-svg-prop { - --eye-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %f5-16-svg-prop { - --f5-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %f5-24-svg-prop { - --f5-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %f5-color-16-svg-prop { - --f5-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %f5-color-24-svg-prop { - --f5-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%facebook-16-svg-prop { + --facebook-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%facebook-24-svg-prop { + --facebook-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%facebook-color-16-svg-prop { + --facebook-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%facebook-color-24-svg-prop { + --facebook-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %fast-forward-16-svg-prop { - --fast-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fast-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %fast-forward-24-svg-prop { - --fast-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fast-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-16-svg-prop { - --file-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-24-svg-prop { - --file-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-change-16-svg-prop { - --file-change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-change-24-svg-prop { - --file-change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-check-16-svg-prop { - --file-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-check-24-svg-prop { - --file-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-diff-16-svg-prop { - --file-diff-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-diff-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-diff-24-svg-prop { - --file-diff-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-diff-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-fill-svg-prop { - --file-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %file-16-svg-prop; } %file-minus-16-svg-prop { - --file-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-minus-24-svg-prop { - --file-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-outline-svg-prop { - --file-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %file-16-svg-prop; } %file-plus-16-svg-prop { - --file-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-plus-24-svg-prop { - --file-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-source-16-svg-prop { - --file-source-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-source-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-source-24-svg-prop { - --file-source-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-source-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-text-16-svg-prop { - --file-text-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-text-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-text-24-svg-prop { - --file-text-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-text-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-x-16-svg-prop { - --file-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %file-x-24-svg-prop { - --file-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %files-16-svg-prop { - --files-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --files-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %files-24-svg-prop { - --files-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --files-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %film-16-svg-prop { - --film-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --film-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %film-24-svg-prop { - --film-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --film-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-16-svg-prop { - --filter-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-24-svg-prop { - --filter-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-circle-16-svg-prop { - --filter-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-circle-24-svg-prop { - --filter-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-fill-16-svg-prop { - --filter-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-fill-24-svg-prop { - --filter-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %filter-svg-prop { - --filter-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %filter-16-svg-prop; } %fingerprint-16-svg-prop { - --fingerprint-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fingerprint-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %fingerprint-24-svg-prop { - --fingerprint-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fingerprint-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %flag-16-svg-prop { - --flag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --flag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %flag-24-svg-prop { - --flag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --flag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %flag-svg-prop { - --flag-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %flag-16-svg-prop; } %folder-16-svg-prop { - --folder-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-24-svg-prop { - --folder-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-fill-16-svg-prop { - --folder-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-fill-24-svg-prop { - --folder-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-fill-svg-prop { - --folder-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %folder-fill-16-svg-prop; } %folder-minus-16-svg-prop { - --folder-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-minus-24-svg-prop { - --folder-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-minus-fill-16-svg-prop { - --folder-minus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-minus-fill-24-svg-prop { - --folder-minus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-outline-svg-prop { - --folder-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %folder-16-svg-prop; } %folder-plus-16-svg-prop { - --folder-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-plus-24-svg-prop { - --folder-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-plus-fill-16-svg-prop { - --folder-plus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-plus-fill-24-svg-prop { - --folder-plus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-star-16-svg-prop { - --folder-star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-star-24-svg-prop { - --folder-star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-users-16-svg-prop { - --folder-users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %folder-users-24-svg-prop { - --folder-users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %frown-16-svg-prop { - --frown-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --frown-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %frown-24-svg-prop { - --frown-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --frown-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gateway-16-svg-prop { - --gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gateway-24-svg-prop { - --gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gateway-svg-prop { - --gateway-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gateway-16-svg-prop; } %gcp-16-svg-prop { - --gcp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gcp-24-svg-prop { - --gcp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gcp-color-16-svg-prop { - --gcp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gcp-color-24-svg-prop { - --gcp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gift-16-svg-prop { - --gift-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gift-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gift-24-svg-prop { - --gift-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gift-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gift-fill-svg-prop { - --gift-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gift-16-svg-prop; } %gift-outline-svg-prop { - --gift-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gift-16-svg-prop; } %git-branch-16-svg-prop { - --git-branch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-branch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-branch-24-svg-prop { - --git-branch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-branch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-branch-svg-prop { - --git-branch-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %git-branch-16-svg-prop; } %git-commit-16-svg-prop { - --git-commit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-commit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-commit-24-svg-prop { - --git-commit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-commit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-commit-svg-prop { - --git-commit-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %git-commit-16-svg-prop; } %git-merge-16-svg-prop { - --git-merge-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-merge-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-merge-24-svg-prop { - --git-merge-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-merge-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-pull-request-16-svg-prop { - --git-pull-request-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-pull-request-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-pull-request-24-svg-prop { - --git-pull-request-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-pull-request-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-pull-request-svg-prop { - --git-pull-request-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %git-pull-request-16-svg-prop; } %git-repo-16-svg-prop { - --git-repo-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-repo-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-repo-24-svg-prop { - --git-repo-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-repo-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %git-repository-svg-prop { - --git-repository-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %git-repo-16-svg-prop; } %github-16-svg-prop { - --github-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %github-24-svg-prop { - --github-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %github-color-16-svg-prop { - --github-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %github-color-24-svg-prop { - --github-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gitlab-16-svg-prop { - --gitlab-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gitlab-24-svg-prop { - --gitlab-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gitlab-color-16-svg-prop { - --gitlab-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %gitlab-color-24-svg-prop { - --gitlab-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %globe-16-svg-prop { - --globe-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %globe-24-svg-prop { - --globe-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %globe-private-16-svg-prop { - --globe-private-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-private-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %globe-private-24-svg-prop { - --globe-private-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-private-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %google-16-svg-prop { - --google-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %google-24-svg-prop { - --google-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %google-color-16-svg-prop { - --google-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %google-color-24-svg-prop { - --google-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %grid-16-svg-prop { - --grid-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %grid-24-svg-prop { - --grid-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %grid-alt-16-svg-prop { - --grid-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %grid-alt-24-svg-prop { - --grid-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %guide-16-svg-prop { - --guide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %guide-24-svg-prop { - --guide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %guide-link-16-svg-prop { - --guide-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %guide-link-24-svg-prop { - --guide-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %guide-svg-prop { - --guide-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %guide-16-svg-prop; } %hammer-16-svg-prop { - --hammer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hammer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hammer-24-svg-prop { - --hammer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hammer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%handshake-16-svg-prop { + --handshake-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%handshake-24-svg-prop { + --handshake-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hard-drive-16-svg-prop { - --hard-drive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hard-drive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hard-drive-24-svg-prop { - --hard-drive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hard-drive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hash-16-svg-prop { - --hash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hash-24-svg-prop { - --hash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hashicorp-16-svg-prop { + --hashicorp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hashicorp-24-svg-prop { + --hashicorp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hashicorp-color-16-svg-prop { + --hashicorp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hashicorp-color-24-svg-prop { + --hashicorp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hcp-16-svg-prop { + --hcp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hcp-24-svg-prop { + --hcp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hcp-color-16-svg-prop { + --hcp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%hcp-color-24-svg-prop { + --hcp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %headphones-16-svg-prop { - --headphones-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --headphones-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %headphones-24-svg-prop { - --headphones-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --headphones-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %health-svg-prop { - --health-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %activity-16-svg-prop; } %heart-16-svg-prop { - --heart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %heart-24-svg-prop { - --heart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %heart-fill-16-svg-prop { - --heart-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %heart-fill-24-svg-prop { - --heart-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %heart-off-16-svg-prop { - --heart-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %heart-off-24-svg-prop { - --heart-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %help-16-svg-prop { - --help-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --help-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %help-24-svg-prop { - --help-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --help-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %help-circle-fill-svg-prop { - --help-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %help-16-svg-prop; } %help-circle-outline-svg-prop { - --help-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %help-16-svg-prop; } %hexagon-16-svg-prop { - --hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hexagon-24-svg-prop { - --hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hexagon-fill-16-svg-prop { - --hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hexagon-fill-24-svg-prop { - --hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %history-16-svg-prop { - --history-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --history-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %history-24-svg-prop { - --history-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --history-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %history-svg-prop { - --history-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %history-16-svg-prop; } %home-16-svg-prop { - --home-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --home-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %home-24-svg-prop { - --home-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --home-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hourglass-16-svg-prop { - --hourglass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hourglass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %hourglass-24-svg-prop { - --hourglass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hourglass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %identity-service-16-svg-prop { - --identity-service-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-service-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %identity-service-24-svg-prop { - --identity-service-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-service-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %identity-user-16-svg-prop { - --identity-user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %identity-user-24-svg-prop { - --identity-user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %image-16-svg-prop { - --image-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --image-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %image-24-svg-prop { - --image-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --image-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %inbox-16-svg-prop { - --inbox-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --inbox-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %inbox-24-svg-prop { - --inbox-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --inbox-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %info-16-svg-prop { - --info-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --info-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %info-24-svg-prop { - --info-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --info-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %info-circle-fill-svg-prop { - --info-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %info-16-svg-prop; } %info-circle-outline-svg-prop { - --info-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %info-16-svg-prop; } %jump-link-16-svg-prop { - --jump-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --jump-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %jump-link-24-svg-prop { - --jump-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --jump-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %key-16-svg-prop { - --key-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %key-24-svg-prop { - --key-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %key-values-16-svg-prop { - --key-values-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-values-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %key-values-24-svg-prop { - --key-values-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-values-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %key-svg-prop { - --key-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %key-16-svg-prop; +} + +%keychain-16-svg-prop { + --keychain-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%keychain-24-svg-prop { + --keychain-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %kubernetes-16-svg-prop { - --kubernetes-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %kubernetes-24-svg-prop { - --kubernetes-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %kubernetes-color-16-svg-prop { - --kubernetes-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %kubernetes-color-24-svg-prop { - --kubernetes-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %labyrinth-16-svg-prop { - --labyrinth-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --labyrinth-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %labyrinth-24-svg-prop { - --labyrinth-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --labyrinth-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %layers-16-svg-prop { - --layers-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layers-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %layers-24-svg-prop { - --layers-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layers-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %layers-svg-prop { - --layers-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %layers-16-svg-prop; } %layout-16-svg-prop { - --layout-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layout-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %layout-24-svg-prop { - --layout-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layout-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %learn-16-svg-prop { - --learn-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %learn-24-svg-prop { - --learn-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %learn-link-16-svg-prop { - --learn-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %learn-link-24-svg-prop { - --learn-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %learn-svg-prop { - --learn-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %learn-16-svg-prop; } %line-chart-16-svg-prop { - --line-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %line-chart-24-svg-prop { - --line-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %line-chart-up-16-svg-prop { - --line-chart-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %line-chart-up-24-svg-prop { - --line-chart-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %link-16-svg-prop { - --link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %link-24-svg-prop { - --link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %link-svg-prop { - --link-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %link-16-svg-prop; +} + +%linkedin-16-svg-prop { + --linkedin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%linkedin-24-svg-prop { + --linkedin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%linkedin-color-16-svg-prop { + --linkedin-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%linkedin-color-24-svg-prop { + --linkedin-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %list-16-svg-prop { - --list-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --list-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %list-24-svg-prop { - --list-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --list-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%load-balancer-16-svg-prop { + --load-balancer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%load-balancer-24-svg-prop { + --load-balancer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %loading-svg-prop { - --loading-svg: url('data:image/svg+xml;charset=UTF-8,'); + --loading-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-16-svg-prop { - --lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-24-svg-prop { - --lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-closed-fill-svg-prop { - --lock-closed-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %lock-fill-16-svg-prop; } %lock-closed-outline-svg-prop { - --lock-closed-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %lock-16-svg-prop; } %lock-closed-svg-prop { - --lock-closed-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %lock-fill-16-svg-prop; } %lock-disabled-svg-prop { - --lock-disabled-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %lock-off-16-svg-prop; } %lock-fill-16-svg-prop { - --lock-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-fill-24-svg-prop { - --lock-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-off-16-svg-prop { - --lock-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-off-24-svg-prop { - --lock-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %lock-open-svg-prop { - --lock-open-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %unlock-16-svg-prop; } %logo-alicloud-color-svg-prop { - --logo-alicloud-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %alibaba-color-16-svg-prop; } %logo-alicloud-monochrome-svg-prop { - --logo-alicloud-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %alibaba-16-svg-prop; } %logo-auth0-color-svg-prop { - --logo-auth0-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %auth0-color-16-svg-prop; } %logo-aws-color-svg-prop { - --logo-aws-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %aws-color-16-svg-prop; } %logo-aws-monochrome-svg-prop { - --logo-aws-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %aws-16-svg-prop; } %logo-azure-color-svg-prop { - --logo-azure-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %azure-color-16-svg-prop; } %logo-azure-dev-ops-color-svg-prop { - --logo-azure-dev-ops-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %azure-devops-color-16-svg-prop; } %logo-azure-dev-ops-monochrome-svg-prop { - --logo-azure-dev-ops-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %azure-devops-16-svg-prop; } %logo-azure-monochrome-svg-prop { - --logo-azure-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %azure-16-svg-prop; } %logo-bitbucket-color-svg-prop { - --logo-bitbucket-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %bitbucket-color-16-svg-prop; } %logo-bitbucket-monochrome-svg-prop { - --logo-bitbucket-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %bitbucket-16-svg-prop; } %logo-consul-color-svg-prop { - --logo-consul-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %consul-color-16-svg-prop; } %logo-ember-circle-color-svg-prop { @@ -2227,27 +2403,27 @@ } %logo-gcp-color-svg-prop { - --logo-gcp-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gcp-color-16-svg-prop; } %logo-gcp-monochrome-svg-prop { - --logo-gcp-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gcp-16-svg-prop; } %logo-github-color-svg-prop { - --logo-github-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %github-color-16-svg-prop; } %logo-github-monochrome-svg-prop { - --logo-github-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %github-16-svg-prop; } %logo-gitlab-color-svg-prop { - --logo-gitlab-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gitlab-color-16-svg-prop; } %logo-gitlab-monochrome-svg-prop { - --logo-gitlab-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %gitlab-16-svg-prop; } %logo-glimmer-color-svg-prop { @@ -2255,11 +2431,11 @@ } %logo-google-color-svg-prop { - --logo-google-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %google-color-16-svg-prop; } %logo-google-monochrome-svg-prop { - --logo-google-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %google-16-svg-prop; } %logo-hashicorp-color-svg-prop { @@ -2271,19 +2447,19 @@ } %logo-kubernetes-color-svg-prop { - --logo-kubernetes-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %kubernetes-color-16-svg-prop; } %logo-kubernetes-monochrome-svg-prop { - --logo-kubernetes-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %kubernetes-16-svg-prop; } %logo-microsoft-color-svg-prop { - --logo-microsoft-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %microsoft-color-16-svg-prop; } %logo-nomad-color-svg-prop { - --logo-nomad-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %nomad-color-16-svg-prop; } %logo-oidc-color-svg-prop { @@ -2291,27 +2467,27 @@ } %logo-okta-color-svg-prop { - --logo-okta-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %okta-color-16-svg-prop; } %logo-oracle-color-svg-prop { - --logo-oracle-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %oracle-color-16-svg-prop; } %logo-oracle-monochrome-svg-prop { - --logo-oracle-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %oracle-16-svg-prop; } %logo-slack-color-svg-prop { - --logo-slack-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %slack-color-16-svg-prop; } %logo-slack-monochrome-svg-prop { - --logo-slack-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %slack-16-svg-prop; } %logo-terraform-color-svg-prop { - --logo-terraform-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %terraform-color-16-svg-prop; } %logo-vault-color-svg-prop { @@ -2319,619 +2495,675 @@ } %logo-vmware-color-svg-prop { - --logo-vmware-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %vmware-color-16-svg-prop; } %logo-vmware-monochrome-svg-prop { - --logo-vmware-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %vmware-16-svg-prop; } %mail-16-svg-prop { - --mail-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mail-24-svg-prop { - --mail-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mail-open-16-svg-prop { - --mail-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mail-open-24-svg-prop { - --mail-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%mainframe-16-svg-prop { + --mainframe-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%mainframe-24-svg-prop { + --mainframe-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %map-16-svg-prop { - --map-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %map-24-svg-prop { - --map-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %map-pin-16-svg-prop { - --map-pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %map-pin-24-svg-prop { - --map-pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %maximize-16-svg-prop { - --maximize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %maximize-24-svg-prop { - --maximize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %maximize-alt-16-svg-prop { - --maximize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %maximize-alt-24-svg-prop { - --maximize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %meh-16-svg-prop { - --meh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --meh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %meh-24-svg-prop { - --meh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --meh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %menu-16-svg-prop { - --menu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --menu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %menu-24-svg-prop { - --menu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --menu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %menu-svg-prop { - --menu-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %menu-16-svg-prop; } %mesh-16-svg-prop { - --mesh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mesh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mesh-24-svg-prop { - --mesh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mesh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mesh-svg-prop { - --mesh-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %mesh-16-svg-prop; } %message-circle-16-svg-prop { - --message-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-circle-24-svg-prop { - --message-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-circle-fill-16-svg-prop { - --message-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-circle-fill-24-svg-prop { - --message-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-square-16-svg-prop { - --message-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-square-24-svg-prop { - --message-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-square-fill-16-svg-prop { - --message-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-square-fill-24-svg-prop { - --message-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %message-svg-prop { - --message-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %message-square-fill-16-svg-prop; } %mic-16-svg-prop { - --mic-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mic-24-svg-prop { - --mic-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mic-off-16-svg-prop { - --mic-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mic-off-24-svg-prop { - --mic-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %microsoft-16-svg-prop { - --microsoft-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %microsoft-24-svg-prop { - --microsoft-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %microsoft-color-16-svg-prop { - --microsoft-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %microsoft-color-24-svg-prop { - --microsoft-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %migrate-16-svg-prop { - --migrate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --migrate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %migrate-24-svg-prop { - --migrate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --migrate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minimize-16-svg-prop { - --minimize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minimize-24-svg-prop { - --minimize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minimize-alt-16-svg-prop { - --minimize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minimize-alt-24-svg-prop { - --minimize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-16-svg-prop { - --minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-24-svg-prop { - --minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-circle-16-svg-prop { - --minus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-circle-24-svg-prop { - --minus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-circle-fill-svg-prop { - --minus-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %minus-circle-16-svg-prop; } %minus-circle-outline-svg-prop { - --minus-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %minus-circle-16-svg-prop; } %minus-plain-svg-prop { - --minus-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %minus-16-svg-prop; } %minus-plus-16-svg-prop { - --minus-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-plus-24-svg-prop { - --minus-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-plus-circle-16-svg-prop { - --minus-plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-plus-circle-24-svg-prop { - --minus-plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-plus-square-16-svg-prop { - --minus-plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-plus-square-24-svg-prop { - --minus-plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-square-16-svg-prop { - --minus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-square-24-svg-prop { - --minus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %minus-square-fill-svg-prop { - --minus-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %minus-square-16-svg-prop; } %module-16-svg-prop { - --module-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --module-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %module-24-svg-prop { - --module-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --module-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %module-svg-prop { - --module-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %module-16-svg-prop; } %monitor-16-svg-prop { - --monitor-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --monitor-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %monitor-24-svg-prop { - --monitor-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --monitor-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %moon-16-svg-prop { - --moon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --moon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %moon-24-svg-prop { - --moon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --moon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %more-horizontal-16-svg-prop { - --more-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %more-horizontal-24-svg-prop { - --more-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %more-horizontal-svg-prop { - --more-horizontal-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %more-horizontal-16-svg-prop; } %more-vertical-16-svg-prop { - --more-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %more-vertical-24-svg-prop { - --more-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %more-vertical-svg-prop { - --more-vertical-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %more-vertical-16-svg-prop; } %mouse-pointer-16-svg-prop { - --mouse-pointer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mouse-pointer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %mouse-pointer-24-svg-prop { - --mouse-pointer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mouse-pointer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %move-16-svg-prop { - --move-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --move-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %move-24-svg-prop { - --move-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --move-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %music-16-svg-prop { - --music-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --music-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %music-24-svg-prop { - --music-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --music-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %navigation-16-svg-prop { - --navigation-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %navigation-24-svg-prop { - --navigation-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %navigation-alt-16-svg-prop { - --navigation-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %navigation-alt-24-svg-prop { - --navigation-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %network-16-svg-prop { - --network-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %network-24-svg-prop { - --network-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %network-alt-16-svg-prop { - --network-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %network-alt-24-svg-prop { - --network-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %newspaper-16-svg-prop { - --newspaper-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --newspaper-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %newspaper-24-svg-prop { - --newspaper-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --newspaper-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %node-16-svg-prop { - --node-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --node-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %node-24-svg-prop { - --node-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --node-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%nomad-16-svg-prop { + --nomad-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%nomad-24-svg-prop { + --nomad-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%nomad-color-16-svg-prop { + --nomad-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%nomad-color-24-svg-prop { + --nomad-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %notification-disabled-svg-prop { - --notification-disabled-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %bell-off-16-svg-prop; } %notification-fill-svg-prop { - --notification-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %bell-active-fill-16-svg-prop; } %notification-outline-svg-prop { - --notification-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %bell-16-svg-prop; } %octagon-16-svg-prop { - --octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %octagon-24-svg-prop { - --octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %okta-16-svg-prop { - --okta-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %okta-24-svg-prop { - --okta-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %okta-color-16-svg-prop { - --okta-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %okta-color-24-svg-prop { - --okta-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %oracle-16-svg-prop { - --oracle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %oracle-24-svg-prop { - --oracle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %oracle-color-16-svg-prop { - --oracle-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %oracle-color-24-svg-prop { - --oracle-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %org-16-svg-prop { - --org-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --org-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %org-24-svg-prop { - --org-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --org-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %outline-16-svg-prop { - --outline-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --outline-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %outline-24-svg-prop { - --outline-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --outline-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %outline-svg-prop { - --outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %outline-16-svg-prop; +} + +%pack-16-svg-prop { + --pack-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%pack-24-svg-prop { + --pack-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%pack-color-16-svg-prop { + --pack-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%pack-color-24-svg-prop { + --pack-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %package-16-svg-prop { - --package-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --package-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %package-24-svg-prop { - --package-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --package-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%packer-16-svg-prop { + --packer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%packer-24-svg-prop { + --packer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%packer-color-16-svg-prop { + --packer-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%packer-color-24-svg-prop { + --packer-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %page-outline-svg-prop { - --page-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %outline-16-svg-prop; } %paperclip-16-svg-prop { - --paperclip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --paperclip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %paperclip-24-svg-prop { - --paperclip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --paperclip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %partner-svg-prop { - --partner-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %users-16-svg-prop; } %path-16-svg-prop { - --path-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --path-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %path-24-svg-prop { - --path-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --path-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %path-svg-prop { - --path-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %path-16-svg-prop; } %pause-16-svg-prop { - --pause-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pause-24-svg-prop { - --pause-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pause-circle-16-svg-prop { - --pause-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pause-circle-24-svg-prop { - --pause-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pen-tool-16-svg-prop { - --pen-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pen-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pen-tool-24-svg-prop { - --pen-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pen-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pencil-tool-16-svg-prop { - --pencil-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pencil-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pencil-tool-24-svg-prop { - --pencil-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pencil-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %phone-16-svg-prop { - --phone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %phone-24-svg-prop { - --phone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %phone-call-16-svg-prop { - --phone-call-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-call-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %phone-call-24-svg-prop { - --phone-call-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-call-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %phone-off-16-svg-prop { - --phone-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %phone-off-24-svg-prop { - --phone-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pie-chart-16-svg-prop { - --pie-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pie-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pie-chart-24-svg-prop { - --pie-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pie-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pin-16-svg-prop { - --pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %pin-24-svg-prop { - --pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %play-16-svg-prop { - --play-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %play-24-svg-prop { - --play-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %play-circle-16-svg-prop { - --play-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %play-circle-24-svg-prop { - --play-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %play-fill-svg-prop { - --play-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %play-circle-16-svg-prop; } %play-outline-svg-prop { - --play-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %play-circle-16-svg-prop; } %play-plain-svg-prop { - --play-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %play-16-svg-prop; } %plus-16-svg-prop { - --plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %plus-24-svg-prop { - --plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %plus-circle-16-svg-prop { - --plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %plus-circle-24-svg-prop { - --plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %plus-circle-fill-svg-prop { - --plus-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %plus-circle-16-svg-prop; } %plus-circle-outline-svg-prop { - --plus-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %plus-circle-16-svg-prop; } %plus-plain-svg-prop { - --plus-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %plus-16-svg-prop; } %plus-square-16-svg-prop { - --plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %plus-square-24-svg-prop { - --plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %plus-square-fill-svg-prop { - --plus-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %plus-square-16-svg-prop; } %port-svg-prop { @@ -2939,19 +3171,19 @@ } %power-16-svg-prop { - --power-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --power-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %power-24-svg-prop { - --power-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --power-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %printer-16-svg-prop { - --printer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --printer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %printer-24-svg-prop { - --printer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --printer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %protocol-svg-prop { @@ -2959,191 +3191,191 @@ } %provider-16-svg-prop { - --provider-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --provider-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %provider-24-svg-prop { - --provider-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --provider-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %provider-svg-prop { - --provider-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %provider-16-svg-prop; } %public-default-svg-prop { - --public-default-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %globe-16-svg-prop; } %public-locked-svg-prop { - --public-locked-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %globe-private-16-svg-prop; } %queue-16-svg-prop { - --queue-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --queue-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %queue-24-svg-prop { - --queue-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --queue-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %queue-svg-prop { - --queue-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %queue-16-svg-prop; } %radio-16-svg-prop { - --radio-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --radio-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %radio-24-svg-prop { - --radio-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --radio-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %radio-button-checked-svg-prop { - --radio-button-checked-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %circle-dot-16-svg-prop; } %radio-button-unchecked-svg-prop { - --radio-button-unchecked-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %circle-16-svg-prop; } %random-16-svg-prop { - --random-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --random-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %random-24-svg-prop { - --random-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --random-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %random-svg-prop { - --random-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %random-16-svg-prop; } %redirect-16-svg-prop { - --redirect-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --redirect-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %redirect-24-svg-prop { - --redirect-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --redirect-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %redirect-svg-prop { - --redirect-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %redirect-16-svg-prop; } %refresh-alert-svg-prop { - --refresh-alert-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %sync-alert-16-svg-prop; } %refresh-default-svg-prop { - --refresh-default-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %sync-16-svg-prop; } %reload-16-svg-prop { - --reload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --reload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %reload-24-svg-prop { - --reload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --reload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %remix-svg-prop { - --remix-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %shuffle-16-svg-prop; } %repeat-16-svg-prop { - --repeat-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --repeat-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %repeat-24-svg-prop { - --repeat-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --repeat-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %replication-direct-16-svg-prop { - --replication-direct-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-direct-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %replication-direct-24-svg-prop { - --replication-direct-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-direct-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %replication-perf-16-svg-prop { - --replication-perf-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-perf-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %replication-perf-24-svg-prop { - --replication-perf-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-perf-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rewind-16-svg-prop { - --rewind-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rewind-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rewind-24-svg-prop { - --rewind-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rewind-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %ribbon-svg-prop { - --ribbon-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %award-16-svg-prop; } %rocket-16-svg-prop { - --rocket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rocket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rocket-24-svg-prop { - --rocket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rocket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rotate-ccw-16-svg-prop { - --rotate-ccw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-ccw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rotate-ccw-24-svg-prop { - --rotate-ccw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-ccw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rotate-cw-16-svg-prop { - --rotate-cw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-cw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rotate-cw-24-svg-prop { - --rotate-cw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-cw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rss-16-svg-prop { - --rss-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rss-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %rss-24-svg-prop { - --rss-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rss-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %run-svg-prop { - --run-svg: url('data:image/svg+xml;charset=UTF-8,'); + --run-svg: url('data:image/svg+xml;charset=UTF-8,'); } %save-16-svg-prop { - --save-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --save-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %save-24-svg-prop { - --save-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --save-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %scissors-16-svg-prop { - --scissors-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --scissors-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %scissors-24-svg-prop { - --scissors-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --scissors-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %search-16-svg-prop { - --search-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --search-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %search-24-svg-prop { - --search-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --search-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %search-color-svg-prop { @@ -3151,251 +3383,251 @@ } %search-svg-prop { - --search-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %search-16-svg-prop; } %send-16-svg-prop { - --send-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --send-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %send-24-svg-prop { - --send-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --send-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %server-16-svg-prop { - --server-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %server-24-svg-prop { - --server-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %server-cluster-16-svg-prop { - --server-cluster-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-cluster-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %server-cluster-24-svg-prop { - --server-cluster-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-cluster-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %serverless-16-svg-prop { - --serverless-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --serverless-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %serverless-24-svg-prop { - --serverless-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --serverless-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %settings-16-svg-prop { - --settings-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --settings-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %settings-24-svg-prop { - --settings-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --settings-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %settings-svg-prop { - --settings-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %settings-16-svg-prop; } %share-16-svg-prop { - --share-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --share-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %share-24-svg-prop { - --share-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --share-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-16-svg-prop { - --shield-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-24-svg-prop { - --shield-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-alert-16-svg-prop { - --shield-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-alert-24-svg-prop { - --shield-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-check-16-svg-prop { - --shield-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-check-24-svg-prop { - --shield-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-off-16-svg-prop { - --shield-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-off-24-svg-prop { - --shield-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-x-16-svg-prop { - --shield-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shield-x-24-svg-prop { - --shield-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shopping-bag-16-svg-prop { - --shopping-bag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-bag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shopping-bag-24-svg-prop { - --shopping-bag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-bag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shopping-cart-16-svg-prop { - --shopping-cart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-cart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shopping-cart-24-svg-prop { - --shopping-cart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-cart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shuffle-16-svg-prop { - --shuffle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shuffle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %shuffle-24-svg-prop { - --shuffle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shuffle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sidebar-16-svg-prop { - --sidebar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sidebar-24-svg-prop { - --sidebar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sidebar-hide-16-svg-prop { - --sidebar-hide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-hide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sidebar-hide-24-svg-prop { - --sidebar-hide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-hide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sidebar-show-16-svg-prop { - --sidebar-show-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-show-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sidebar-show-24-svg-prop { - --sidebar-show-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-show-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sign-in-16-svg-prop { - --sign-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sign-in-24-svg-prop { - --sign-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sign-out-16-svg-prop { - --sign-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sign-out-24-svg-prop { - --sign-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %skip-16-svg-prop { - --skip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %skip-24-svg-prop { - --skip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %skip-back-16-svg-prop { - --skip-back-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-back-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %skip-back-24-svg-prop { - --skip-back-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-back-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %skip-forward-16-svg-prop { - --skip-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %skip-forward-24-svg-prop { - --skip-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slack-16-svg-prop { - --slack-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slack-24-svg-prop { - --slack-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slack-color-16-svg-prop { - --slack-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slack-color-24-svg-prop { - --slack-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slash-16-svg-prop { - --slash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slash-24-svg-prop { - --slash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slash-square-16-svg-prop { - --slash-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %slash-square-24-svg-prop { - --slash-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sliders-16-svg-prop { - --sliders-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sliders-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sliders-24-svg-prop { - --sliders-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sliders-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %smartphone-16-svg-prop { - --smartphone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smartphone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %smartphone-24-svg-prop { - --smartphone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smartphone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %smile-16-svg-prop { - --smile-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smile-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %smile-24-svg-prop { - --smile-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smile-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %socket-16-svg-prop { - --socket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --socket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %socket-24-svg-prop { - --socket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --socket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %socket-svg-prop { @@ -3403,733 +3635,837 @@ } %sort-asc-16-svg-prop { - --sort-asc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-asc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sort-asc-24-svg-prop { - --sort-asc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-asc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sort-desc-16-svg-prop { - --sort-desc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-desc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sort-desc-24-svg-prop { - --sort-desc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-desc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sort-svg-prop { - --sort-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %sort-desc-16-svg-prop; } %source-file-svg-prop { - --source-file-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %file-source-16-svg-prop; } %speaker-16-svg-prop { - --speaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --speaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %speaker-24-svg-prop { - --speaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --speaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %square-16-svg-prop { - --square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %square-24-svg-prop { - --square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %square-fill-16-svg-prop { - --square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %square-fill-24-svg-prop { - --square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-16-svg-prop { - --star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-24-svg-prop { - --star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-circle-16-svg-prop { - --star-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-circle-24-svg-prop { - --star-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-fill-16-svg-prop { - --star-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-fill-24-svg-prop { - --star-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-fill-svg-prop { - --star-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %star-fill-16-svg-prop; } %star-off-16-svg-prop { - --star-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-off-24-svg-prop { - --star-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %star-outline-svg-prop { - --star-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %star-16-svg-prop; } %stop-circle-16-svg-prop { - --stop-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --stop-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %stop-circle-24-svg-prop { - --stop-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --stop-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sub-left-svg-prop { - --sub-left-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %corner-down-left-16-svg-prop; } %sub-right-svg-prop { - --sub-right-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %corner-down-right-16-svg-prop; } %sun-16-svg-prop { - --sun-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sun-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sun-24-svg-prop { - --sun-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sun-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %support-16-svg-prop { - --support-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --support-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %support-24-svg-prop { - --support-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --support-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %support-svg-prop { - --support-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %support-16-svg-prop; } %swap-horizontal-16-svg-prop { - --swap-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %swap-horizontal-24-svg-prop { - --swap-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %swap-horizontal-svg-prop { - --swap-horizontal-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %swap-horizontal-16-svg-prop; } %swap-vertical-16-svg-prop { - --swap-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %swap-vertical-24-svg-prop { - --swap-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %swap-vertical-svg-prop { - --swap-vertical-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %swap-vertical-16-svg-prop; } %switcher-16-svg-prop { - --switcher-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --switcher-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %switcher-24-svg-prop { - --switcher-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --switcher-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sync-16-svg-prop { - --sync-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sync-24-svg-prop { - --sync-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sync-alert-16-svg-prop { - --sync-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sync-alert-24-svg-prop { - --sync-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sync-reverse-16-svg-prop { - --sync-reverse-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-reverse-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %sync-reverse-24-svg-prop { - --sync-reverse-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-reverse-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tablet-16-svg-prop { - --tablet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tablet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tablet-24-svg-prop { - --tablet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tablet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tag-16-svg-prop { - --tag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tag-24-svg-prop { - --tag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tag-svg-prop { - --tag-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %tag-16-svg-prop; } %target-16-svg-prop { - --target-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --target-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %target-24-svg-prop { - --target-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --target-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %terminal-16-svg-prop { - --terminal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %terminal-24-svg-prop { - --terminal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %terminal-screen-16-svg-prop { - --terminal-screen-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-screen-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %terminal-screen-24-svg-prop { - --terminal-screen-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-screen-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%terraform-16-svg-prop { + --terraform-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%terraform-24-svg-prop { + --terraform-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%terraform-color-16-svg-prop { + --terraform-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%terraform-color-24-svg-prop { + --terraform-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %thumbs-down-16-svg-prop { - --thumbs-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %thumbs-down-24-svg-prop { - --thumbs-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %thumbs-up-16-svg-prop { - --thumbs-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %thumbs-up-24-svg-prop { - --thumbs-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %toggle-left-16-svg-prop { - --toggle-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %toggle-left-24-svg-prop { - --toggle-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %toggle-right-16-svg-prop { - --toggle-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %toggle-right-24-svg-prop { - --toggle-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %token-16-svg-prop { - --token-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --token-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %token-24-svg-prop { - --token-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --token-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tools-16-svg-prop { - --tools-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tools-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tools-24-svg-prop { - --tools-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tools-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %top-16-svg-prop { - --top-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --top-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %top-24-svg-prop { - --top-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --top-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %trash-16-svg-prop { - --trash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %trash-24-svg-prop { - --trash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %trash-svg-prop { - --trash-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %trash-16-svg-prop; } %trend-down-16-svg-prop { - --trend-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %trend-down-24-svg-prop { - --trend-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %trend-up-16-svg-prop { - --trend-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %trend-up-24-svg-prop { - --trend-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %triangle-16-svg-prop { - --triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %triangle-24-svg-prop { - --triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %triangle-fill-16-svg-prop { - --triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %triangle-fill-24-svg-prop { - --triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %truck-16-svg-prop { - --truck-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --truck-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %truck-24-svg-prop { - --truck-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --truck-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tune-svg-prop { - --tune-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %sliders-16-svg-prop; } %tv-16-svg-prop { - --tv-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tv-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %tv-24-svg-prop { - --tv-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tv-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitch-16-svg-prop { + --twitch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitch-24-svg-prop { + --twitch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitch-color-16-svg-prop { + --twitch-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitch-color-24-svg-prop { + --twitch-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitter-16-svg-prop { + --twitter-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitter-24-svg-prop { + --twitter-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitter-color-16-svg-prop { + --twitter-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%twitter-color-24-svg-prop { + --twitter-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %type-16-svg-prop { - --type-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --type-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %type-24-svg-prop { - --type-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --type-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %unfold-close-16-svg-prop { - --unfold-close-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-close-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %unfold-close-24-svg-prop { - --unfold-close-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-close-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %unfold-less-svg-prop { - --unfold-less-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %unfold-close-16-svg-prop; } %unfold-more-svg-prop { - --unfold-more-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %unfold-open-16-svg-prop; } %unfold-open-16-svg-prop { - --unfold-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %unfold-open-24-svg-prop { - --unfold-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } -%union-svg { - --union-svg: url('data:image/svg+xml;charset=UTF-8,'); +%union-svg-prop { + --union-svg: url('data:image/svg+xml;charset=UTF-8,'); } %unlock-16-svg-prop { - --unlock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unlock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %unlock-24-svg-prop { - --unlock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unlock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %upload-16-svg-prop { - --upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %upload-24-svg-prop { - --upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %upload-svg-prop { - --upload-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %upload-16-svg-prop; } %user-16-svg-prop { - --user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-24-svg-prop { - --user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-add-svg-prop { - --user-add-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %user-plus-16-svg-prop; } %user-check-16-svg-prop { - --user-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-check-24-svg-prop { - --user-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-circle-16-svg-prop { - --user-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-circle-24-svg-prop { - --user-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-circle-fill-16-svg-prop { - --user-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-circle-fill-24-svg-prop { - --user-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-minus-16-svg-prop { - --user-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-minus-24-svg-prop { - --user-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-organization-svg-prop { - --user-organization-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %org-16-svg-prop; } %user-plain-svg-prop { - --user-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %user-16-svg-prop; } %user-plus-16-svg-prop { - --user-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-plus-24-svg-prop { - --user-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-square-fill-svg-prop { - --user-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %user-circle-fill-16-svg-prop; } %user-square-outline-svg-prop { - --user-square-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %user-circle-16-svg-prop; } %user-team-svg-prop { - --user-team-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %users-16-svg-prop; } %user-x-16-svg-prop { - --user-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %user-x-24-svg-prop { - --user-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %users-16-svg-prop { - --users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %users-24-svg-prop { - --users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%vagrant-16-svg-prop { + --vagrant-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%vagrant-24-svg-prop { + --vagrant-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%vagrant-color-16-svg-prop { + --vagrant-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%vagrant-color-24-svg-prop { + --vagrant-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %vault-16-svg-prop { - --vault-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vault-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %vault-24-svg-prop { - --vault-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vault-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%vault-color-16-svg-prop { + --vault-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%vault-color-24-svg-prop { + --vault-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %verified-16-svg-prop { - --verified-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --verified-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %verified-24-svg-prop { - --verified-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --verified-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %video-16-svg-prop { - --video-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %video-24-svg-prop { - --video-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %video-off-16-svg-prop { - --video-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %video-off-24-svg-prop { - --video-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %visibility-hide-svg-prop { - --visibility-hide-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %eye-off-16-svg-prop; } %visibility-show-svg-prop { - --visibility-show-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %eye-16-svg-prop; } %vmware-16-svg-prop { - --vmware-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %vmware-24-svg-prop { - --vmware-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %vmware-color-16-svg-prop { - --vmware-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %vmware-color-24-svg-prop { - --vmware-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-16-svg-prop { - --volume-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-2-16-svg-prop { - --volume-2-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-2-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-2-24-svg-prop { - --volume-2-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-2-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-24-svg-prop { - --volume-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-down-16-svg-prop { - --volume-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-down-24-svg-prop { - --volume-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-x-16-svg-prop { - --volume-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %volume-x-24-svg-prop { - --volume-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wall-16-svg-prop { - --wall-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wall-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wall-24-svg-prop { - --wall-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wall-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %watch-16-svg-prop { - --watch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --watch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %watch-24-svg-prop { - --watch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --watch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%waypoint-16-svg-prop { + --waypoint-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%waypoint-24-svg-prop { + --waypoint-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%waypoint-color-16-svg-prop { + --waypoint-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%waypoint-color-24-svg-prop { + --waypoint-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %webhook-16-svg-prop { - --webhook-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --webhook-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %webhook-24-svg-prop { - --webhook-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --webhook-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %webhook-svg-prop { - --webhook-svg: url('data:image/svg+xml;charset=UTF-8,'); + @extend %webhook-16-svg-prop; } %wifi-16-svg-prop { - --wifi-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wifi-24-svg-prop { - --wifi-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wifi-off-16-svg-prop { - --wifi-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wifi-off-24-svg-prop { - --wifi-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wrench-16-svg-prop { - --wrench-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wrench-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %wrench-24-svg-prop { - --wrench-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wrench-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-16-svg-prop { - --x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-24-svg-prop { - --x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-circle-16-svg-prop { - --x-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-circle-24-svg-prop { - --x-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-circle-fill-16-svg-prop { - --x-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-circle-fill-24-svg-prop { - --x-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-diamond-16-svg-prop { - --x-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-diamond-24-svg-prop { - --x-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-diamond-fill-16-svg-prop { - --x-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-diamond-fill-24-svg-prop { - --x-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-hexagon-16-svg-prop { - --x-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-hexagon-24-svg-prop { - --x-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-hexagon-fill-16-svg-prop { - --x-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-hexagon-fill-24-svg-prop { - --x-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-square-16-svg-prop { - --x-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-square-24-svg-prop { - --x-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-square-fill-16-svg-prop { - --x-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %x-square-fill-24-svg-prop { - --x-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%youtube-16-svg-prop { + --youtube-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%youtube-24-svg-prop { + --youtube-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%youtube-color-16-svg-prop { + --youtube-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); +} + +%youtube-color-24-svg-prop { + --youtube-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zap-16-svg-prop { - --zap-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zap-24-svg-prop { - --zap-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zap-off-16-svg-prop { - --zap-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zap-off-24-svg-prop { - --zap-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zoom-in-16-svg-prop { - --zoom-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zoom-in-24-svg-prop { - --zoom-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zoom-out-16-svg-prop { - --zoom-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); } %zoom-out-24-svg-prop { - --zoom-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } diff --git a/ui/packages/consul-ui/app/styles/base/icons/debug.scss b/ui/packages/consul-ui/app/styles/base/icons/debug.scss index 8106bc04e3..16fe3c648d 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/debug.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/debug.scss @@ -1,4 +1,3 @@ - .debug-with-activity-16-mask-before::before, .debug-with-activity-16-icon-before::before, .debug-with-activity-16-mask-after::after, @@ -898,6 +897,130 @@ background-image: var(--align-right-24-svg); } +.debug-with-amazon-eks-16-mask-before::before, +.debug-with-amazon-eks-16-icon-before::before, +.debug-with-amazon-eks-16-mask-after::after, +.debug-with-amazon-eks-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-amazon-eks-16-mask-before::before, +.debug-with-amazon-eks-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--amazon-eks-16-svg); + mask-image: var(--amazon-eks-16-svg); +} +.debug-with-amazon-eks-16-icon-before::before, +.debug-with-amazon-eks-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--amazon-eks-16-svg); +} + +.debug-with-amazon-eks-24-mask-before::before, +.debug-with-amazon-eks-24-icon-before::before, +.debug-with-amazon-eks-24-mask-after::after, +.debug-with-amazon-eks-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-amazon-eks-24-mask-before::before, +.debug-with-amazon-eks-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--amazon-eks-24-svg); + mask-image: var(--amazon-eks-24-svg); +} +.debug-with-amazon-eks-24-icon-before::before, +.debug-with-amazon-eks-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--amazon-eks-24-svg); +} + +.debug-with-amazon-eks-color-16-mask-before::before, +.debug-with-amazon-eks-color-16-icon-before::before, +.debug-with-amazon-eks-color-16-mask-after::after, +.debug-with-amazon-eks-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-amazon-eks-color-16-mask-before::before, +.debug-with-amazon-eks-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--amazon-eks-color-16-svg); + mask-image: var(--amazon-eks-color-16-svg); +} +.debug-with-amazon-eks-color-16-icon-before::before, +.debug-with-amazon-eks-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--amazon-eks-color-16-svg); +} + +.debug-with-amazon-eks-color-24-mask-before::before, +.debug-with-amazon-eks-color-24-icon-before::before, +.debug-with-amazon-eks-color-24-mask-after::after, +.debug-with-amazon-eks-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-amazon-eks-color-24-mask-before::before, +.debug-with-amazon-eks-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--amazon-eks-color-24-svg); + mask-image: var(--amazon-eks-color-24-svg); +} +.debug-with-amazon-eks-color-24-icon-before::before, +.debug-with-amazon-eks-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--amazon-eks-color-24-svg); +} + .debug-with-apple-16-mask-before::before, .debug-with-apple-16-icon-before::before, .debug-with-apple-16-mask-after::after, @@ -2386,6 +2509,130 @@ background-image: var(--aws-color-24-svg); } +.debug-with-aws-ec2-16-mask-before::before, +.debug-with-aws-ec2-16-icon-before::before, +.debug-with-aws-ec2-16-mask-after::after, +.debug-with-aws-ec2-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-aws-ec2-16-mask-before::before, +.debug-with-aws-ec2-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--aws-ec2-16-svg); + mask-image: var(--aws-ec2-16-svg); +} +.debug-with-aws-ec2-16-icon-before::before, +.debug-with-aws-ec2-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--aws-ec2-16-svg); +} + +.debug-with-aws-ec2-24-mask-before::before, +.debug-with-aws-ec2-24-icon-before::before, +.debug-with-aws-ec2-24-mask-after::after, +.debug-with-aws-ec2-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-aws-ec2-24-mask-before::before, +.debug-with-aws-ec2-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--aws-ec2-24-svg); + mask-image: var(--aws-ec2-24-svg); +} +.debug-with-aws-ec2-24-icon-before::before, +.debug-with-aws-ec2-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--aws-ec2-24-svg); +} + +.debug-with-aws-ec2-color-16-mask-before::before, +.debug-with-aws-ec2-color-16-icon-before::before, +.debug-with-aws-ec2-color-16-mask-after::after, +.debug-with-aws-ec2-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-aws-ec2-color-16-mask-before::before, +.debug-with-aws-ec2-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--aws-ec2-color-16-svg); + mask-image: var(--aws-ec2-color-16-svg); +} +.debug-with-aws-ec2-color-16-icon-before::before, +.debug-with-aws-ec2-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--aws-ec2-color-16-svg); +} + +.debug-with-aws-ec2-color-24-mask-before::before, +.debug-with-aws-ec2-color-24-icon-before::before, +.debug-with-aws-ec2-color-24-mask-after::after, +.debug-with-aws-ec2-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-aws-ec2-color-24-mask-before::before, +.debug-with-aws-ec2-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--aws-ec2-color-24-svg); + mask-image: var(--aws-ec2-color-24-svg); +} +.debug-with-aws-ec2-color-24-icon-before::before, +.debug-with-aws-ec2-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--aws-ec2-color-24-svg); +} + .debug-with-azure-16-mask-before::before, .debug-with-azure-16-icon-before::before, .debug-with-azure-16-mask-after::after, @@ -2634,6 +2881,68 @@ background-image: var(--azure-devops-color-24-svg); } +.debug-with-bank-vault-16-mask-before::before, +.debug-with-bank-vault-16-icon-before::before, +.debug-with-bank-vault-16-mask-after::after, +.debug-with-bank-vault-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-bank-vault-16-mask-before::before, +.debug-with-bank-vault-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--bank-vault-16-svg); + mask-image: var(--bank-vault-16-svg); +} +.debug-with-bank-vault-16-icon-before::before, +.debug-with-bank-vault-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--bank-vault-16-svg); +} + +.debug-with-bank-vault-24-mask-before::before, +.debug-with-bank-vault-24-icon-before::before, +.debug-with-bank-vault-24-mask-after::after, +.debug-with-bank-vault-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-bank-vault-24-mask-before::before, +.debug-with-bank-vault-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--bank-vault-24-svg); + mask-image: var(--bank-vault-24-svg); +} +.debug-with-bank-vault-24-icon-before::before, +.debug-with-bank-vault-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--bank-vault-24-svg); +} + .debug-with-bar-chart-16-mask-before::before, .debug-with-bar-chart-16-icon-before::before, .debug-with-bar-chart-16-mask-after::after, @@ -3781,6 +4090,130 @@ background-image: var(--bottom-24-svg); } +.debug-with-boundary-16-mask-before::before, +.debug-with-boundary-16-icon-before::before, +.debug-with-boundary-16-mask-after::after, +.debug-with-boundary-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-boundary-16-mask-before::before, +.debug-with-boundary-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--boundary-16-svg); + mask-image: var(--boundary-16-svg); +} +.debug-with-boundary-16-icon-before::before, +.debug-with-boundary-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--boundary-16-svg); +} + +.debug-with-boundary-24-mask-before::before, +.debug-with-boundary-24-icon-before::before, +.debug-with-boundary-24-mask-after::after, +.debug-with-boundary-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-boundary-24-mask-before::before, +.debug-with-boundary-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--boundary-24-svg); + mask-image: var(--boundary-24-svg); +} +.debug-with-boundary-24-icon-before::before, +.debug-with-boundary-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--boundary-24-svg); +} + +.debug-with-boundary-color-16-mask-before::before, +.debug-with-boundary-color-16-icon-before::before, +.debug-with-boundary-color-16-mask-after::after, +.debug-with-boundary-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-boundary-color-16-mask-before::before, +.debug-with-boundary-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--boundary-color-16-svg); + mask-image: var(--boundary-color-16-svg); +} +.debug-with-boundary-color-16-icon-before::before, +.debug-with-boundary-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--boundary-color-16-svg); +} + +.debug-with-boundary-color-24-mask-before::before, +.debug-with-boundary-color-24-icon-before::before, +.debug-with-boundary-color-24-mask-after::after, +.debug-with-boundary-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-boundary-color-24-mask-before::before, +.debug-with-boundary-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--boundary-color-24-svg); + mask-image: var(--boundary-color-24-svg); +} +.debug-with-boundary-color-24-icon-before::before, +.debug-with-boundary-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--boundary-color-24-svg); +} + .debug-with-box-16-mask-before::before, .debug-with-box-16-icon-before::before, .debug-with-box-16-mask-after::after, @@ -7408,6 +7841,130 @@ background-image: var(--code-svg); } +.debug-with-codepen-16-mask-before::before, +.debug-with-codepen-16-icon-before::before, +.debug-with-codepen-16-mask-after::after, +.debug-with-codepen-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-codepen-16-mask-before::before, +.debug-with-codepen-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--codepen-16-svg); + mask-image: var(--codepen-16-svg); +} +.debug-with-codepen-16-icon-before::before, +.debug-with-codepen-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--codepen-16-svg); +} + +.debug-with-codepen-24-mask-before::before, +.debug-with-codepen-24-icon-before::before, +.debug-with-codepen-24-mask-after::after, +.debug-with-codepen-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-codepen-24-mask-before::before, +.debug-with-codepen-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--codepen-24-svg); + mask-image: var(--codepen-24-svg); +} +.debug-with-codepen-24-icon-before::before, +.debug-with-codepen-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--codepen-24-svg); +} + +.debug-with-codepen-color-16-mask-before::before, +.debug-with-codepen-color-16-icon-before::before, +.debug-with-codepen-color-16-mask-after::after, +.debug-with-codepen-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-codepen-color-16-mask-before::before, +.debug-with-codepen-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--codepen-color-16-svg); + mask-image: var(--codepen-color-16-svg); +} +.debug-with-codepen-color-16-icon-before::before, +.debug-with-codepen-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--codepen-color-16-svg); +} + +.debug-with-codepen-color-24-mask-before::before, +.debug-with-codepen-color-24-icon-before::before, +.debug-with-codepen-color-24-mask-after::after, +.debug-with-codepen-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-codepen-color-24-mask-before::before, +.debug-with-codepen-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--codepen-color-24-svg); + mask-image: var(--codepen-color-24-svg); +} +.debug-with-codepen-color-24-icon-before::before, +.debug-with-codepen-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--codepen-color-24-svg); +} + .debug-with-collections-16-mask-before::before, .debug-with-collections-16-icon-before::before, .debug-with-collections-16-mask-after::after, @@ -7749,6 +8306,130 @@ background-image: var(--console-svg); } +.debug-with-consul-16-mask-before::before, +.debug-with-consul-16-icon-before::before, +.debug-with-consul-16-mask-after::after, +.debug-with-consul-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-consul-16-mask-before::before, +.debug-with-consul-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--consul-16-svg); + mask-image: var(--consul-16-svg); +} +.debug-with-consul-16-icon-before::before, +.debug-with-consul-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--consul-16-svg); +} + +.debug-with-consul-24-mask-before::before, +.debug-with-consul-24-icon-before::before, +.debug-with-consul-24-mask-after::after, +.debug-with-consul-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-consul-24-mask-before::before, +.debug-with-consul-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--consul-24-svg); + mask-image: var(--consul-24-svg); +} +.debug-with-consul-24-icon-before::before, +.debug-with-consul-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--consul-24-svg); +} + +.debug-with-consul-color-16-mask-before::before, +.debug-with-consul-color-16-icon-before::before, +.debug-with-consul-color-16-mask-after::after, +.debug-with-consul-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-consul-color-16-mask-before::before, +.debug-with-consul-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--consul-color-16-svg); + mask-image: var(--consul-color-16-svg); +} +.debug-with-consul-color-16-icon-before::before, +.debug-with-consul-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--consul-color-16-svg); +} + +.debug-with-consul-color-24-mask-before::before, +.debug-with-consul-color-24-icon-before::before, +.debug-with-consul-color-24-mask-after::after, +.debug-with-consul-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-consul-color-24-mask-before::before, +.debug-with-consul-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--consul-color-24-svg); + mask-image: var(--consul-color-24-svg); +} +.debug-with-consul-color-24-icon-before::before, +.debug-with-consul-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--consul-color-24-svg); +} + .debug-with-copy-action-mask-before::before, .debug-with-copy-action-icon-before::before, .debug-with-copy-action-mask-after::after, @@ -10849,6 +11530,130 @@ background-image: var(--f5-color-24-svg); } +.debug-with-facebook-16-mask-before::before, +.debug-with-facebook-16-icon-before::before, +.debug-with-facebook-16-mask-after::after, +.debug-with-facebook-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-facebook-16-mask-before::before, +.debug-with-facebook-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--facebook-16-svg); + mask-image: var(--facebook-16-svg); +} +.debug-with-facebook-16-icon-before::before, +.debug-with-facebook-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--facebook-16-svg); +} + +.debug-with-facebook-24-mask-before::before, +.debug-with-facebook-24-icon-before::before, +.debug-with-facebook-24-mask-after::after, +.debug-with-facebook-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-facebook-24-mask-before::before, +.debug-with-facebook-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--facebook-24-svg); + mask-image: var(--facebook-24-svg); +} +.debug-with-facebook-24-icon-before::before, +.debug-with-facebook-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--facebook-24-svg); +} + +.debug-with-facebook-color-16-mask-before::before, +.debug-with-facebook-color-16-icon-before::before, +.debug-with-facebook-color-16-mask-after::after, +.debug-with-facebook-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-facebook-color-16-mask-before::before, +.debug-with-facebook-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--facebook-color-16-svg); + mask-image: var(--facebook-color-16-svg); +} +.debug-with-facebook-color-16-icon-before::before, +.debug-with-facebook-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--facebook-color-16-svg); +} + +.debug-with-facebook-color-24-mask-before::before, +.debug-with-facebook-color-24-icon-before::before, +.debug-with-facebook-color-24-mask-after::after, +.debug-with-facebook-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-facebook-color-24-mask-before::before, +.debug-with-facebook-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--facebook-color-24-svg); + mask-image: var(--facebook-color-24-svg); +} +.debug-with-facebook-color-24-icon-before::before, +.debug-with-facebook-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--facebook-color-24-svg); +} + .debug-with-fast-forward-16-mask-before::before, .debug-with-fast-forward-16-icon-before::before, .debug-with-fast-forward-16-mask-after::after, @@ -14259,6 +15064,68 @@ background-image: var(--hammer-24-svg); } +.debug-with-handshake-16-mask-before::before, +.debug-with-handshake-16-icon-before::before, +.debug-with-handshake-16-mask-after::after, +.debug-with-handshake-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-handshake-16-mask-before::before, +.debug-with-handshake-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--handshake-16-svg); + mask-image: var(--handshake-16-svg); +} +.debug-with-handshake-16-icon-before::before, +.debug-with-handshake-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--handshake-16-svg); +} + +.debug-with-handshake-24-mask-before::before, +.debug-with-handshake-24-icon-before::before, +.debug-with-handshake-24-mask-after::after, +.debug-with-handshake-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-handshake-24-mask-before::before, +.debug-with-handshake-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--handshake-24-svg); + mask-image: var(--handshake-24-svg); +} +.debug-with-handshake-24-icon-before::before, +.debug-with-handshake-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--handshake-24-svg); +} + .debug-with-hard-drive-16-mask-before::before, .debug-with-hard-drive-16-icon-before::before, .debug-with-hard-drive-16-mask-after::after, @@ -14383,6 +15250,254 @@ background-image: var(--hash-24-svg); } +.debug-with-hashicorp-16-mask-before::before, +.debug-with-hashicorp-16-icon-before::before, +.debug-with-hashicorp-16-mask-after::after, +.debug-with-hashicorp-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hashicorp-16-mask-before::before, +.debug-with-hashicorp-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hashicorp-16-svg); + mask-image: var(--hashicorp-16-svg); +} +.debug-with-hashicorp-16-icon-before::before, +.debug-with-hashicorp-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hashicorp-16-svg); +} + +.debug-with-hashicorp-24-mask-before::before, +.debug-with-hashicorp-24-icon-before::before, +.debug-with-hashicorp-24-mask-after::after, +.debug-with-hashicorp-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hashicorp-24-mask-before::before, +.debug-with-hashicorp-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hashicorp-24-svg); + mask-image: var(--hashicorp-24-svg); +} +.debug-with-hashicorp-24-icon-before::before, +.debug-with-hashicorp-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hashicorp-24-svg); +} + +.debug-with-hashicorp-color-16-mask-before::before, +.debug-with-hashicorp-color-16-icon-before::before, +.debug-with-hashicorp-color-16-mask-after::after, +.debug-with-hashicorp-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hashicorp-color-16-mask-before::before, +.debug-with-hashicorp-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hashicorp-color-16-svg); + mask-image: var(--hashicorp-color-16-svg); +} +.debug-with-hashicorp-color-16-icon-before::before, +.debug-with-hashicorp-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hashicorp-color-16-svg); +} + +.debug-with-hashicorp-color-24-mask-before::before, +.debug-with-hashicorp-color-24-icon-before::before, +.debug-with-hashicorp-color-24-mask-after::after, +.debug-with-hashicorp-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hashicorp-color-24-mask-before::before, +.debug-with-hashicorp-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hashicorp-color-24-svg); + mask-image: var(--hashicorp-color-24-svg); +} +.debug-with-hashicorp-color-24-icon-before::before, +.debug-with-hashicorp-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hashicorp-color-24-svg); +} + +.debug-with-hcp-16-mask-before::before, +.debug-with-hcp-16-icon-before::before, +.debug-with-hcp-16-mask-after::after, +.debug-with-hcp-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hcp-16-mask-before::before, +.debug-with-hcp-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hcp-16-svg); + mask-image: var(--hcp-16-svg); +} +.debug-with-hcp-16-icon-before::before, +.debug-with-hcp-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hcp-16-svg); +} + +.debug-with-hcp-24-mask-before::before, +.debug-with-hcp-24-icon-before::before, +.debug-with-hcp-24-mask-after::after, +.debug-with-hcp-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hcp-24-mask-before::before, +.debug-with-hcp-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hcp-24-svg); + mask-image: var(--hcp-24-svg); +} +.debug-with-hcp-24-icon-before::before, +.debug-with-hcp-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hcp-24-svg); +} + +.debug-with-hcp-color-16-mask-before::before, +.debug-with-hcp-color-16-icon-before::before, +.debug-with-hcp-color-16-mask-after::after, +.debug-with-hcp-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hcp-color-16-mask-before::before, +.debug-with-hcp-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hcp-color-16-svg); + mask-image: var(--hcp-color-16-svg); +} +.debug-with-hcp-color-16-icon-before::before, +.debug-with-hcp-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hcp-color-16-svg); +} + +.debug-with-hcp-color-24-mask-before::before, +.debug-with-hcp-color-24-icon-before::before, +.debug-with-hcp-color-24-mask-after::after, +.debug-with-hcp-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-hcp-color-24-mask-before::before, +.debug-with-hcp-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--hcp-color-24-svg); + mask-image: var(--hcp-color-24-svg); +} +.debug-with-hcp-color-24-icon-before::before, +.debug-with-hcp-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--hcp-color-24-svg); +} + .debug-with-headphones-16-mask-before::before, .debug-with-headphones-16-icon-before::before, .debug-with-headphones-16-mask-after::after, @@ -15716,6 +16831,68 @@ background-image: var(--key-svg); } +.debug-with-keychain-16-mask-before::before, +.debug-with-keychain-16-icon-before::before, +.debug-with-keychain-16-mask-after::after, +.debug-with-keychain-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-keychain-16-mask-before::before, +.debug-with-keychain-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--keychain-16-svg); + mask-image: var(--keychain-16-svg); +} +.debug-with-keychain-16-icon-before::before, +.debug-with-keychain-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--keychain-16-svg); +} + +.debug-with-keychain-24-mask-before::before, +.debug-with-keychain-24-icon-before::before, +.debug-with-keychain-24-mask-after::after, +.debug-with-keychain-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-keychain-24-mask-before::before, +.debug-with-keychain-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--keychain-24-svg); + mask-image: var(--keychain-24-svg); +} +.debug-with-keychain-24-icon-before::before, +.debug-with-keychain-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--keychain-24-svg); +} + .debug-with-kubernetes-16-mask-before::before, .debug-with-kubernetes-16-icon-before::before, .debug-with-kubernetes-16-mask-after::after, @@ -16429,6 +17606,130 @@ background-image: var(--link-svg); } +.debug-with-linkedin-16-mask-before::before, +.debug-with-linkedin-16-icon-before::before, +.debug-with-linkedin-16-mask-after::after, +.debug-with-linkedin-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-linkedin-16-mask-before::before, +.debug-with-linkedin-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--linkedin-16-svg); + mask-image: var(--linkedin-16-svg); +} +.debug-with-linkedin-16-icon-before::before, +.debug-with-linkedin-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--linkedin-16-svg); +} + +.debug-with-linkedin-24-mask-before::before, +.debug-with-linkedin-24-icon-before::before, +.debug-with-linkedin-24-mask-after::after, +.debug-with-linkedin-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-linkedin-24-mask-before::before, +.debug-with-linkedin-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--linkedin-24-svg); + mask-image: var(--linkedin-24-svg); +} +.debug-with-linkedin-24-icon-before::before, +.debug-with-linkedin-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--linkedin-24-svg); +} + +.debug-with-linkedin-color-16-mask-before::before, +.debug-with-linkedin-color-16-icon-before::before, +.debug-with-linkedin-color-16-mask-after::after, +.debug-with-linkedin-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-linkedin-color-16-mask-before::before, +.debug-with-linkedin-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--linkedin-color-16-svg); + mask-image: var(--linkedin-color-16-svg); +} +.debug-with-linkedin-color-16-icon-before::before, +.debug-with-linkedin-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--linkedin-color-16-svg); +} + +.debug-with-linkedin-color-24-mask-before::before, +.debug-with-linkedin-color-24-icon-before::before, +.debug-with-linkedin-color-24-mask-after::after, +.debug-with-linkedin-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-linkedin-color-24-mask-before::before, +.debug-with-linkedin-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--linkedin-color-24-svg); + mask-image: var(--linkedin-color-24-svg); +} +.debug-with-linkedin-color-24-icon-before::before, +.debug-with-linkedin-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--linkedin-color-24-svg); +} + .debug-with-list-16-mask-before::before, .debug-with-list-16-icon-before::before, .debug-with-list-16-mask-after::after, @@ -16491,6 +17792,68 @@ background-image: var(--list-24-svg); } +.debug-with-load-balancer-16-mask-before::before, +.debug-with-load-balancer-16-icon-before::before, +.debug-with-load-balancer-16-mask-after::after, +.debug-with-load-balancer-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-load-balancer-16-mask-before::before, +.debug-with-load-balancer-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--load-balancer-16-svg); + mask-image: var(--load-balancer-16-svg); +} +.debug-with-load-balancer-16-icon-before::before, +.debug-with-load-balancer-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--load-balancer-16-svg); +} + +.debug-with-load-balancer-24-mask-before::before, +.debug-with-load-balancer-24-icon-before::before, +.debug-with-load-balancer-24-mask-after::after, +.debug-with-load-balancer-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-load-balancer-24-mask-before::before, +.debug-with-load-balancer-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--load-balancer-24-svg); + mask-image: var(--load-balancer-24-svg); +} +.debug-with-load-balancer-24-icon-before::before, +.debug-with-load-balancer-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--load-balancer-24-svg); +} + .debug-with-loading-mask-before::before, .debug-with-loading-icon-before::before, .debug-with-loading-mask-after::after, @@ -18165,6 +19528,68 @@ background-image: var(--mail-open-24-svg); } +.debug-with-mainframe-16-mask-before::before, +.debug-with-mainframe-16-icon-before::before, +.debug-with-mainframe-16-mask-after::after, +.debug-with-mainframe-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-mainframe-16-mask-before::before, +.debug-with-mainframe-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--mainframe-16-svg); + mask-image: var(--mainframe-16-svg); +} +.debug-with-mainframe-16-icon-before::before, +.debug-with-mainframe-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--mainframe-16-svg); +} + +.debug-with-mainframe-24-mask-before::before, +.debug-with-mainframe-24-icon-before::before, +.debug-with-mainframe-24-mask-after::after, +.debug-with-mainframe-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-mainframe-24-mask-before::before, +.debug-with-mainframe-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--mainframe-24-svg); + mask-image: var(--mainframe-24-svg); +} +.debug-with-mainframe-24-icon-before::before, +.debug-with-mainframe-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--mainframe-24-svg); +} + .debug-with-map-16-mask-before::before, .debug-with-map-16-icon-before::before, .debug-with-map-16-mask-after::after, @@ -20831,6 +22256,130 @@ background-image: var(--node-24-svg); } +.debug-with-nomad-16-mask-before::before, +.debug-with-nomad-16-icon-before::before, +.debug-with-nomad-16-mask-after::after, +.debug-with-nomad-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-nomad-16-mask-before::before, +.debug-with-nomad-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--nomad-16-svg); + mask-image: var(--nomad-16-svg); +} +.debug-with-nomad-16-icon-before::before, +.debug-with-nomad-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--nomad-16-svg); +} + +.debug-with-nomad-24-mask-before::before, +.debug-with-nomad-24-icon-before::before, +.debug-with-nomad-24-mask-after::after, +.debug-with-nomad-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-nomad-24-mask-before::before, +.debug-with-nomad-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--nomad-24-svg); + mask-image: var(--nomad-24-svg); +} +.debug-with-nomad-24-icon-before::before, +.debug-with-nomad-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--nomad-24-svg); +} + +.debug-with-nomad-color-16-mask-before::before, +.debug-with-nomad-color-16-icon-before::before, +.debug-with-nomad-color-16-mask-after::after, +.debug-with-nomad-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-nomad-color-16-mask-before::before, +.debug-with-nomad-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--nomad-color-16-svg); + mask-image: var(--nomad-color-16-svg); +} +.debug-with-nomad-color-16-icon-before::before, +.debug-with-nomad-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--nomad-color-16-svg); +} + +.debug-with-nomad-color-24-mask-before::before, +.debug-with-nomad-color-24-icon-before::before, +.debug-with-nomad-color-24-mask-after::after, +.debug-with-nomad-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-nomad-color-24-mask-before::before, +.debug-with-nomad-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--nomad-color-24-svg); + mask-image: var(--nomad-color-24-svg); +} +.debug-with-nomad-color-24-icon-before::before, +.debug-with-nomad-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--nomad-color-24-svg); +} + .debug-with-notification-disabled-mask-before::before, .debug-with-notification-disabled-icon-before::before, .debug-with-notification-disabled-mask-after::after, @@ -21389,6 +22938,130 @@ background-image: var(--outline-svg); } +.debug-with-pack-16-mask-before::before, +.debug-with-pack-16-icon-before::before, +.debug-with-pack-16-mask-after::after, +.debug-with-pack-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-pack-16-mask-before::before, +.debug-with-pack-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--pack-16-svg); + mask-image: var(--pack-16-svg); +} +.debug-with-pack-16-icon-before::before, +.debug-with-pack-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--pack-16-svg); +} + +.debug-with-pack-24-mask-before::before, +.debug-with-pack-24-icon-before::before, +.debug-with-pack-24-mask-after::after, +.debug-with-pack-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-pack-24-mask-before::before, +.debug-with-pack-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--pack-24-svg); + mask-image: var(--pack-24-svg); +} +.debug-with-pack-24-icon-before::before, +.debug-with-pack-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--pack-24-svg); +} + +.debug-with-pack-color-16-mask-before::before, +.debug-with-pack-color-16-icon-before::before, +.debug-with-pack-color-16-mask-after::after, +.debug-with-pack-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-pack-color-16-mask-before::before, +.debug-with-pack-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--pack-color-16-svg); + mask-image: var(--pack-color-16-svg); +} +.debug-with-pack-color-16-icon-before::before, +.debug-with-pack-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--pack-color-16-svg); +} + +.debug-with-pack-color-24-mask-before::before, +.debug-with-pack-color-24-icon-before::before, +.debug-with-pack-color-24-mask-after::after, +.debug-with-pack-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-pack-color-24-mask-before::before, +.debug-with-pack-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--pack-color-24-svg); + mask-image: var(--pack-color-24-svg); +} +.debug-with-pack-color-24-icon-before::before, +.debug-with-pack-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--pack-color-24-svg); +} + .debug-with-package-16-mask-before::before, .debug-with-package-16-icon-before::before, .debug-with-package-16-mask-after::after, @@ -21451,6 +23124,130 @@ background-image: var(--package-24-svg); } +.debug-with-packer-16-mask-before::before, +.debug-with-packer-16-icon-before::before, +.debug-with-packer-16-mask-after::after, +.debug-with-packer-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-packer-16-mask-before::before, +.debug-with-packer-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--packer-16-svg); + mask-image: var(--packer-16-svg); +} +.debug-with-packer-16-icon-before::before, +.debug-with-packer-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--packer-16-svg); +} + +.debug-with-packer-24-mask-before::before, +.debug-with-packer-24-icon-before::before, +.debug-with-packer-24-mask-after::after, +.debug-with-packer-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-packer-24-mask-before::before, +.debug-with-packer-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--packer-24-svg); + mask-image: var(--packer-24-svg); +} +.debug-with-packer-24-icon-before::before, +.debug-with-packer-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--packer-24-svg); +} + +.debug-with-packer-color-16-mask-before::before, +.debug-with-packer-color-16-icon-before::before, +.debug-with-packer-color-16-mask-after::after, +.debug-with-packer-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-packer-color-16-mask-before::before, +.debug-with-packer-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--packer-color-16-svg); + mask-image: var(--packer-color-16-svg); +} +.debug-with-packer-color-16-icon-before::before, +.debug-with-packer-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--packer-color-16-svg); +} + +.debug-with-packer-color-24-mask-before::before, +.debug-with-packer-color-24-icon-before::before, +.debug-with-packer-color-24-mask-after::after, +.debug-with-packer-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-packer-color-24-mask-before::before, +.debug-with-packer-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--packer-color-24-svg); + mask-image: var(--packer-color-24-svg); +} +.debug-with-packer-color-24-icon-before::before, +.debug-with-packer-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--packer-color-24-svg); +} + .debug-with-page-outline-mask-before::before, .debug-with-page-outline-icon-before::before, .debug-with-page-outline-mask-after::after, @@ -28116,6 +29913,130 @@ background-image: var(--terminal-screen-24-svg); } +.debug-with-terraform-16-mask-before::before, +.debug-with-terraform-16-icon-before::before, +.debug-with-terraform-16-mask-after::after, +.debug-with-terraform-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-terraform-16-mask-before::before, +.debug-with-terraform-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--terraform-16-svg); + mask-image: var(--terraform-16-svg); +} +.debug-with-terraform-16-icon-before::before, +.debug-with-terraform-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--terraform-16-svg); +} + +.debug-with-terraform-24-mask-before::before, +.debug-with-terraform-24-icon-before::before, +.debug-with-terraform-24-mask-after::after, +.debug-with-terraform-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-terraform-24-mask-before::before, +.debug-with-terraform-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--terraform-24-svg); + mask-image: var(--terraform-24-svg); +} +.debug-with-terraform-24-icon-before::before, +.debug-with-terraform-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--terraform-24-svg); +} + +.debug-with-terraform-color-16-mask-before::before, +.debug-with-terraform-color-16-icon-before::before, +.debug-with-terraform-color-16-mask-after::after, +.debug-with-terraform-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-terraform-color-16-mask-before::before, +.debug-with-terraform-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--terraform-color-16-svg); + mask-image: var(--terraform-color-16-svg); +} +.debug-with-terraform-color-16-icon-before::before, +.debug-with-terraform-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--terraform-color-16-svg); +} + +.debug-with-terraform-color-24-mask-before::before, +.debug-with-terraform-color-24-icon-before::before, +.debug-with-terraform-color-24-mask-after::after, +.debug-with-terraform-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-terraform-color-24-mask-before::before, +.debug-with-terraform-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--terraform-color-24-svg); + mask-image: var(--terraform-color-24-svg); +} +.debug-with-terraform-color-24-icon-before::before, +.debug-with-terraform-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--terraform-color-24-svg); +} + .debug-with-thumbs-down-16-mask-before::before, .debug-with-thumbs-down-16-icon-before::before, .debug-with-thumbs-down-16-mask-after::after, @@ -29046,6 +30967,254 @@ background-image: var(--tv-24-svg); } +.debug-with-twitch-16-mask-before::before, +.debug-with-twitch-16-icon-before::before, +.debug-with-twitch-16-mask-after::after, +.debug-with-twitch-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitch-16-mask-before::before, +.debug-with-twitch-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitch-16-svg); + mask-image: var(--twitch-16-svg); +} +.debug-with-twitch-16-icon-before::before, +.debug-with-twitch-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitch-16-svg); +} + +.debug-with-twitch-24-mask-before::before, +.debug-with-twitch-24-icon-before::before, +.debug-with-twitch-24-mask-after::after, +.debug-with-twitch-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitch-24-mask-before::before, +.debug-with-twitch-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitch-24-svg); + mask-image: var(--twitch-24-svg); +} +.debug-with-twitch-24-icon-before::before, +.debug-with-twitch-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitch-24-svg); +} + +.debug-with-twitch-color-16-mask-before::before, +.debug-with-twitch-color-16-icon-before::before, +.debug-with-twitch-color-16-mask-after::after, +.debug-with-twitch-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitch-color-16-mask-before::before, +.debug-with-twitch-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitch-color-16-svg); + mask-image: var(--twitch-color-16-svg); +} +.debug-with-twitch-color-16-icon-before::before, +.debug-with-twitch-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitch-color-16-svg); +} + +.debug-with-twitch-color-24-mask-before::before, +.debug-with-twitch-color-24-icon-before::before, +.debug-with-twitch-color-24-mask-after::after, +.debug-with-twitch-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitch-color-24-mask-before::before, +.debug-with-twitch-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitch-color-24-svg); + mask-image: var(--twitch-color-24-svg); +} +.debug-with-twitch-color-24-icon-before::before, +.debug-with-twitch-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitch-color-24-svg); +} + +.debug-with-twitter-16-mask-before::before, +.debug-with-twitter-16-icon-before::before, +.debug-with-twitter-16-mask-after::after, +.debug-with-twitter-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitter-16-mask-before::before, +.debug-with-twitter-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitter-16-svg); + mask-image: var(--twitter-16-svg); +} +.debug-with-twitter-16-icon-before::before, +.debug-with-twitter-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitter-16-svg); +} + +.debug-with-twitter-24-mask-before::before, +.debug-with-twitter-24-icon-before::before, +.debug-with-twitter-24-mask-after::after, +.debug-with-twitter-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitter-24-mask-before::before, +.debug-with-twitter-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitter-24-svg); + mask-image: var(--twitter-24-svg); +} +.debug-with-twitter-24-icon-before::before, +.debug-with-twitter-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitter-24-svg); +} + +.debug-with-twitter-color-16-mask-before::before, +.debug-with-twitter-color-16-icon-before::before, +.debug-with-twitter-color-16-mask-after::after, +.debug-with-twitter-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitter-color-16-mask-before::before, +.debug-with-twitter-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitter-color-16-svg); + mask-image: var(--twitter-color-16-svg); +} +.debug-with-twitter-color-16-icon-before::before, +.debug-with-twitter-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitter-color-16-svg); +} + +.debug-with-twitter-color-24-mask-before::before, +.debug-with-twitter-color-24-icon-before::before, +.debug-with-twitter-color-24-mask-after::after, +.debug-with-twitter-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-twitter-color-24-mask-before::before, +.debug-with-twitter-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--twitter-color-24-svg); + mask-image: var(--twitter-color-24-svg); +} +.debug-with-twitter-color-24-icon-before::before, +.debug-with-twitter-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--twitter-color-24-svg); +} + .debug-with-type-16-mask-before::before, .debug-with-type-16-icon-before::before, .debug-with-type-16-mask-after::after, @@ -29294,6 +31463,37 @@ background-image: var(--unfold-open-24-svg); } +.debug-with-union-mask-before::before, +.debug-with-union-icon-before::before, +.debug-with-union-mask-after::after, +.debug-with-union-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-union-mask-before::before, +.debug-with-union-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--union-svg); + mask-image: var(--union-svg); +} +.debug-with-union-icon-before::before, +.debug-with-union-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--union-svg); +} + .debug-with-unlock-16-mask-before::before, .debug-with-unlock-16-icon-before::before, .debug-with-unlock-16-mask-after::after, @@ -30131,6 +32331,130 @@ background-image: var(--users-24-svg); } +.debug-with-vagrant-16-mask-before::before, +.debug-with-vagrant-16-icon-before::before, +.debug-with-vagrant-16-mask-after::after, +.debug-with-vagrant-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-vagrant-16-mask-before::before, +.debug-with-vagrant-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--vagrant-16-svg); + mask-image: var(--vagrant-16-svg); +} +.debug-with-vagrant-16-icon-before::before, +.debug-with-vagrant-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--vagrant-16-svg); +} + +.debug-with-vagrant-24-mask-before::before, +.debug-with-vagrant-24-icon-before::before, +.debug-with-vagrant-24-mask-after::after, +.debug-with-vagrant-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-vagrant-24-mask-before::before, +.debug-with-vagrant-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--vagrant-24-svg); + mask-image: var(--vagrant-24-svg); +} +.debug-with-vagrant-24-icon-before::before, +.debug-with-vagrant-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--vagrant-24-svg); +} + +.debug-with-vagrant-color-16-mask-before::before, +.debug-with-vagrant-color-16-icon-before::before, +.debug-with-vagrant-color-16-mask-after::after, +.debug-with-vagrant-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-vagrant-color-16-mask-before::before, +.debug-with-vagrant-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--vagrant-color-16-svg); + mask-image: var(--vagrant-color-16-svg); +} +.debug-with-vagrant-color-16-icon-before::before, +.debug-with-vagrant-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--vagrant-color-16-svg); +} + +.debug-with-vagrant-color-24-mask-before::before, +.debug-with-vagrant-color-24-icon-before::before, +.debug-with-vagrant-color-24-mask-after::after, +.debug-with-vagrant-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-vagrant-color-24-mask-before::before, +.debug-with-vagrant-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--vagrant-color-24-svg); + mask-image: var(--vagrant-color-24-svg); +} +.debug-with-vagrant-color-24-icon-before::before, +.debug-with-vagrant-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--vagrant-color-24-svg); +} + .debug-with-vault-16-mask-before::before, .debug-with-vault-16-icon-before::before, .debug-with-vault-16-mask-after::after, @@ -30193,6 +32517,68 @@ background-image: var(--vault-24-svg); } +.debug-with-vault-color-16-mask-before::before, +.debug-with-vault-color-16-icon-before::before, +.debug-with-vault-color-16-mask-after::after, +.debug-with-vault-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-vault-color-16-mask-before::before, +.debug-with-vault-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--vault-color-16-svg); + mask-image: var(--vault-color-16-svg); +} +.debug-with-vault-color-16-icon-before::before, +.debug-with-vault-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--vault-color-16-svg); +} + +.debug-with-vault-color-24-mask-before::before, +.debug-with-vault-color-24-icon-before::before, +.debug-with-vault-color-24-mask-after::after, +.debug-with-vault-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-vault-color-24-mask-before::before, +.debug-with-vault-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--vault-color-24-svg); + mask-image: var(--vault-color-24-svg); +} +.debug-with-vault-color-24-icon-before::before, +.debug-with-vault-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--vault-color-24-svg); +} + .debug-with-verified-16-mask-before::before, .debug-with-verified-16-icon-before::before, .debug-with-verified-16-mask-after::after, @@ -30937,6 +33323,130 @@ background-image: var(--watch-24-svg); } +.debug-with-waypoint-16-mask-before::before, +.debug-with-waypoint-16-icon-before::before, +.debug-with-waypoint-16-mask-after::after, +.debug-with-waypoint-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-waypoint-16-mask-before::before, +.debug-with-waypoint-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--waypoint-16-svg); + mask-image: var(--waypoint-16-svg); +} +.debug-with-waypoint-16-icon-before::before, +.debug-with-waypoint-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--waypoint-16-svg); +} + +.debug-with-waypoint-24-mask-before::before, +.debug-with-waypoint-24-icon-before::before, +.debug-with-waypoint-24-mask-after::after, +.debug-with-waypoint-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-waypoint-24-mask-before::before, +.debug-with-waypoint-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--waypoint-24-svg); + mask-image: var(--waypoint-24-svg); +} +.debug-with-waypoint-24-icon-before::before, +.debug-with-waypoint-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--waypoint-24-svg); +} + +.debug-with-waypoint-color-16-mask-before::before, +.debug-with-waypoint-color-16-icon-before::before, +.debug-with-waypoint-color-16-mask-after::after, +.debug-with-waypoint-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-waypoint-color-16-mask-before::before, +.debug-with-waypoint-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--waypoint-color-16-svg); + mask-image: var(--waypoint-color-16-svg); +} +.debug-with-waypoint-color-16-icon-before::before, +.debug-with-waypoint-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--waypoint-color-16-svg); +} + +.debug-with-waypoint-color-24-mask-before::before, +.debug-with-waypoint-color-24-icon-before::before, +.debug-with-waypoint-color-24-mask-after::after, +.debug-with-waypoint-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-waypoint-color-24-mask-before::before, +.debug-with-waypoint-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--waypoint-color-24-svg); + mask-image: var(--waypoint-color-24-svg); +} +.debug-with-waypoint-color-24-icon-before::before, +.debug-with-waypoint-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--waypoint-color-24-svg); +} + .debug-with-webhook-16-mask-before::before, .debug-with-webhook-16-icon-before::before, .debug-with-webhook-16-mask-after::after, @@ -31774,6 +34284,130 @@ background-image: var(--x-square-fill-24-svg); } +.debug-with-youtube-16-mask-before::before, +.debug-with-youtube-16-icon-before::before, +.debug-with-youtube-16-mask-after::after, +.debug-with-youtube-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-youtube-16-mask-before::before, +.debug-with-youtube-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--youtube-16-svg); + mask-image: var(--youtube-16-svg); +} +.debug-with-youtube-16-icon-before::before, +.debug-with-youtube-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--youtube-16-svg); +} + +.debug-with-youtube-24-mask-before::before, +.debug-with-youtube-24-icon-before::before, +.debug-with-youtube-24-mask-after::after, +.debug-with-youtube-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-youtube-24-mask-before::before, +.debug-with-youtube-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--youtube-24-svg); + mask-image: var(--youtube-24-svg); +} +.debug-with-youtube-24-icon-before::before, +.debug-with-youtube-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--youtube-24-svg); +} + +.debug-with-youtube-color-16-mask-before::before, +.debug-with-youtube-color-16-icon-before::before, +.debug-with-youtube-color-16-mask-after::after, +.debug-with-youtube-color-16-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-youtube-color-16-mask-before::before, +.debug-with-youtube-color-16-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--youtube-color-16-svg); + mask-image: var(--youtube-color-16-svg); +} +.debug-with-youtube-color-16-icon-before::before, +.debug-with-youtube-color-16-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--youtube-color-16-svg); +} + +.debug-with-youtube-color-24-mask-before::before, +.debug-with-youtube-color-24-icon-before::before, +.debug-with-youtube-color-24-mask-after::after, +.debug-with-youtube-color-24-icon-after::after { + display: inline-block; + content: ''; + visibility: visible; + background-size: contain; + width: 1.2em; + height: 1.2em; + vertical-align: text-top; +} +.debug-with-youtube-color-24-mask-before::before, +.debug-with-youtube-color-24-mask-after::after { + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-repeat: no-repeat; + mask-position: center; + background-color: currentColor; + + -webkit-mask-image: var(--youtube-color-24-svg); + mask-image: var(--youtube-color-24-svg); +} +.debug-with-youtube-color-24-icon-before::before, +.debug-with-youtube-color-24-icon-after::after { + background-repeat: no-repeat; + background-position: center; + + background-image: var(--youtube-color-24-svg); +} + .debug-with-zap-16-mask-before::before, .debug-with-zap-16-icon-before::before, .debug-with-zap-16-mask-after::after, @@ -32021,2072 +34655,1904 @@ background-image: var(--zoom-out-24-svg); } - :root { - ---activity-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---activity-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-octagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-octagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alert-triangle-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alibaba-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alibaba-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alibaba-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---alibaba-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-center-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-center-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-justify-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-justify-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---align-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---apple-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---apple-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---apple-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---apple-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---archive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---archive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-down-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-left-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-left-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-left-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-right-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-right-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-right-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---arrow-up-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---at-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---at-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---auth0-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---auth0-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---auth0-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---auth0-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---auto-apply-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---auto-apply-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---award-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---award-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---aws-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---aws-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---aws-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---aws-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-devops-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-devops-24-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-devops-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); - ---azure-devops-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); +:root { + --activity-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bar-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --activity-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bar-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bar-chart-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bar-chart-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---battery-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---battery-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---battery-charging-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---battery-charging-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---beaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-octagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---beaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-active-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alert-triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-active-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-active-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-active-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --alibaba-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bell-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-center-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bitbucket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-center-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bitbucket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-justify-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bitbucket-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-justify-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bitbucket-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bolt-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --align-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-add-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --amazon-eks-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-add-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --amazon-eks-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-add-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --amazon-eks-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-add-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --amazon-eks-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-remove-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-remove-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --apple-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-remove-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --archive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bookmark-remove-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --archive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bottom-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bottom-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---box-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---box-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---box-check-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---box-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---briefcase-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---briefcase-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---broadcast-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bug-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bug-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---bug-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-left-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---build-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---build-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---calendar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---calendar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-right-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---calendar-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---camera-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---camera-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---camera-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---camera-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cancel-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cancel-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cancel-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + --arrow-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cancel-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --at-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cancel-square-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --at-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---caret-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---caret-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---caret-down-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---caret-up-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auth0-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cast-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auto-apply-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cast-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --auto-apply-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---certificate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --award-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---certificate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --award-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---change-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---change-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---change-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-ec2-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---change-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-ec2-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-ec2-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --aws-ec2-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --azure-devops-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bank-vault-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bank-vault-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bar-chart-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-charging-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --battery-charging-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---check-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --beaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --beaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-down-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-left-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-active-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-right-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bell-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevron-up-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bitbucket-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-add-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---chevrons-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bookmark-remove-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bottom-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bottom-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---circle-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --boundary-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clipboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --boundary-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clipboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --boundary-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clipboard-checked-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --boundary-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clipboard-checked-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --box-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clipboard-copy-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --box-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clipboard-copy-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --briefcase-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --briefcase-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bug-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clock-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --bug-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---clock-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --build-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --build-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --calendar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --calendar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-cross-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --camera-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-lightning-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --caret-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-lightning-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --caret-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cast-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cast-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --certificate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --certificate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cloud-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---code-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---code-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --change-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---code-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---collections-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---collections-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---command-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---command-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---compass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---compass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---connection-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---connection-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---connection-gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---connection-gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---console-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---copy-action-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---copy-success-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --check-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-left-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-left-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-left-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-left-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-right-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-right-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-right-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-right-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevron-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---corner-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cpu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---cpu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---credit-card-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---credit-card-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --chevrons-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---crop-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---crop-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---crosshair-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---crosshair-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dashboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dashboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---database-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---database-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --circle-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---database-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---delay-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---delay-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-checked-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---delay-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-checked-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---delete-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-copy-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---delete-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clipboard-copy-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---deny-alt-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---deny-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --clock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---deny-default-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-cross-svg: url('data:image/svg+xml;charset=UTF-8,'); ---disabled-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---disc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---disc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lightning-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---discussion-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lightning-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---discussion-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---discussion-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---discussion-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docker-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docker-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cloud-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --code-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --code-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --codepen-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --codepen-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --codepen-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---docs-svg: url('data:image/svg+xml;charset=UTF-8,'); + --codepen-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dollar-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --collections-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dollar-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --collections-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --command-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --command-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dot-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --compass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---dot-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --compass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---download-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---droplet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --connection-gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---droplet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --consul-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---duplicate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --consul-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---duplicate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --consul-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---edit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --consul-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---edit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---edit-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---entry-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---entry-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-down-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---envelope-sealed-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---envelope-sealed-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---envelope-unsealed--outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---envelope-unsealed-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-left-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---event-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---event-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---exit-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---exit-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-right-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---exit-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---expand-less-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---expand-more-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---external-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --corner-up-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---external-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cpu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---eye-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --cpu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---eye-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --credit-card-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---eye-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --credit-card-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---eye-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crop-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---f5-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crop-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---f5-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crosshair-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---f5-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --crosshair-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---f5-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dashboard-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---fast-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dashboard-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---fast-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --database-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --database-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delay-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delay-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delete-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --delete-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --deny-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-diff-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-diff-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --disc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --disc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-source-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-source-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --discussion-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-text-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-text-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---file-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docker-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---files-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---files-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---film-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---film-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --docs-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dollar-sign-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dollar-sign-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---filter-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-half-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---fingerprint-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --dot-half-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---fingerprint-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --download-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---flag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --download-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---flag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --droplet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---flag-svg: url('data:image/svg+xml;charset=UTF-8,'); + --droplet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --duplicate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --duplicate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --edit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --edit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --entry-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --entry-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --event-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-minus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --event-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-minus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --exit-point-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --exit-point-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --external-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --external-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-plus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-plus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --eye-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---folder-users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---frown-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---frown-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --f5-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --facebook-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --facebook-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gateway-svg: url('data:image/svg+xml;charset=UTF-8,'); + --facebook-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gcp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --facebook-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gcp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fast-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gcp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fast-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gcp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gift-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gift-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-change-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gift-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-change-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gift-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-branch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-branch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-diff-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-branch-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-diff-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-commit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-commit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-commit-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-merge-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-merge-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-source-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-pull-request-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-source-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-pull-request-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-text-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-pull-request-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-text-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-repo-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-repo-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --file-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---git-repository-svg: url('data:image/svg+xml;charset=UTF-8,'); + --files-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---github-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --files-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---github-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --film-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---github-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --film-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---github-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gitlab-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gitlab-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gitlab-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---gitlab-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---globe-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --filter-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---globe-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fingerprint-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---globe-private-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --fingerprint-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---globe-private-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --flag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---google-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --flag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---google-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---google-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---google-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---grid-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---grid-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---grid-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---grid-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---guide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-minus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---guide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---guide-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---guide-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---guide-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-plus-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hammer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hammer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hard-drive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hard-drive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --folder-users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --frown-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --frown-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---headphones-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gateway-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---headphones-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gateway-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---health-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---heart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---heart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---heart-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gcp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---heart-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gift-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---heart-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gift-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---heart-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-branch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---help-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-branch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---help-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-commit-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---help-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-commit-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---help-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-merge-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-merge-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-pull-request-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-pull-request-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-repo-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---history-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --git-repo-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---history-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---history-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---home-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---home-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --github-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hourglass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---hourglass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---identity-service-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---identity-service-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --gitlab-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---identity-user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---identity-user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---image-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-private-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---image-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --globe-private-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---inbox-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---inbox-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---info-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---info-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --google-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---info-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---info-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---jump-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---jump-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --grid-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---key-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---key-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---key-values-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---key-values-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --guide-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---key-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hammer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---kubernetes-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hammer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---kubernetes-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --handshake-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---kubernetes-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --handshake-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---kubernetes-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hard-drive-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---labyrinth-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hard-drive-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---labyrinth-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---layers-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---layers-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hashicorp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---layers-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hashicorp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---layout-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hashicorp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---layout-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hashicorp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---learn-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hcp-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---learn-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hcp-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---learn-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hcp-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---learn-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hcp-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---learn-svg: url('data:image/svg+xml;charset=UTF-8,'); + --headphones-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---line-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --headphones-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---line-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---line-chart-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---line-chart-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---link-svg: url('data:image/svg+xml;charset=UTF-8,'); + --heart-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---list-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --help-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---list-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --help-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---loading-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-closed-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-closed-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --history-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-closed-svg: url('data:image/svg+xml;charset=UTF-8,'); + --history-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-disabled-svg: url('data:image/svg+xml;charset=UTF-8,'); + --home-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --home-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hourglass-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --hourglass-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-service-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---lock-open-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-service-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-alicloud-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-alicloud-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --identity-user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-auth0-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --image-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-aws-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --image-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-aws-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --inbox-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-azure-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --inbox-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-azure-dev-ops-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --info-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-azure-dev-ops-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --info-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-azure-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --jump-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-bitbucket-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --jump-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-bitbucket-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-consul-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-ember-circle-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-values-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-gcp-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --key-values-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-gcp-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --keychain-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-github-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --keychain-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-github-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-gitlab-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-gitlab-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-glimmer-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --kubernetes-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-google-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --labyrinth-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-google-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --labyrinth-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-hashicorp-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layers-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-jwt-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layers-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-kubernetes-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layout-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-kubernetes-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --layout-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-microsoft-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-nomad-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-oidc-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-okta-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --learn-link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-oracle-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-oracle-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-slack-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-slack-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --line-chart-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-terraform-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --link-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-vault-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --link-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-vmware-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --linkedin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---logo-vmware-monochrome-svg: url('data:image/svg+xml;charset=UTF-8,'); + --linkedin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mail-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --linkedin-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mail-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --linkedin-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mail-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --list-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mail-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --list-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---map-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --load-balancer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---map-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --load-balancer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---map-pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --loading-svg: url('data:image/svg+xml;charset=UTF-8,'); ---map-pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---maximize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---maximize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---maximize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---maximize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---meh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --lock-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---meh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-consul-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---menu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-ember-circle-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---menu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-glimmer-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---menu-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-hashicorp-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mesh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-jwt-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mesh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-nomad-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mesh-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-oidc-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-terraform-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --logo-vault-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mail-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mainframe-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mainframe-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---message-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mic-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mic-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mic-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --map-pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mic-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---microsoft-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---microsoft-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---microsoft-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --maximize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---microsoft-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --meh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---migrate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --meh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---migrate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --menu-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minimize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --menu-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minimize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mesh-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minimize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mesh-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minimize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + --message-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mic-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --microsoft-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---minus-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --migrate-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---module-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --migrate-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---module-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---module-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---monitor-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---monitor-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minimize-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---moon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---moon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---more-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---more-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---more-horizontal-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---more-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---more-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---more-vertical-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mouse-pointer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---mouse-pointer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---move-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---move-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --minus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---music-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --module-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---music-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --module-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---navigation-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --monitor-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---navigation-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --monitor-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---navigation-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --moon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---navigation-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --moon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---network-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---network-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---network-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---network-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --more-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---newspaper-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mouse-pointer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---newspaper-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --mouse-pointer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---node-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --move-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---node-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --move-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---notification-disabled-svg: url('data:image/svg+xml;charset=UTF-8,'); + --music-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---notification-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --music-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---notification-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---okta-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --navigation-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---okta-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---okta-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---okta-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-alt-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---oracle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --network-alt-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---oracle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --newspaper-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---oracle-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --newspaper-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---oracle-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --node-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---org-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --node-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---org-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --nomad-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---outline-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --nomad-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---outline-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --nomad-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --nomad-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---package-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --octagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---package-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --octagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---page-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---paperclip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---paperclip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---partner-svg: url('data:image/svg+xml;charset=UTF-8,'); + --okta-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---path-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---path-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---path-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pause-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --oracle-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pause-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --org-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pause-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --org-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pause-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --outline-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pen-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --outline-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pen-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pack-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pencil-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pack-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pencil-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pack-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---phone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pack-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---phone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --package-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---phone-call-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --package-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---phone-call-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --packer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---phone-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --packer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---phone-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --packer-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pie-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --packer-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pie-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --paperclip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --paperclip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --path-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --path-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pause-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pen-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---play-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pen-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pencil-tool-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pencil-tool-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-call-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-call-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --phone-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pie-chart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---plus-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pie-chart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---port-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pin-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---power-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --pin-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---power-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---printer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---printer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---protocol-svg: url('data:image/svg+xml;charset=UTF-8,'); + --play-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---provider-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---provider-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---provider-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---public-default-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---public-locked-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---queue-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --plus-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---queue-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --port-svg: url('data:image/svg+xml;charset=UTF-8,'); ---queue-svg: url('data:image/svg+xml;charset=UTF-8,'); + --power-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---radio-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --power-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---radio-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --printer-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---radio-button-checked-svg: url('data:image/svg+xml;charset=UTF-8,'); + --printer-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---radio-button-unchecked-svg: url('data:image/svg+xml;charset=UTF-8,'); + --protocol-svg: url('data:image/svg+xml;charset=UTF-8,'); ---random-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --provider-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---random-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --provider-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---random-svg: url('data:image/svg+xml;charset=UTF-8,'); + --queue-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---redirect-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --queue-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---redirect-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --radio-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---redirect-svg: url('data:image/svg+xml;charset=UTF-8,'); + --radio-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---refresh-alert-svg: url('data:image/svg+xml;charset=UTF-8,'); + --random-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---refresh-default-svg: url('data:image/svg+xml;charset=UTF-8,'); + --random-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---reload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --redirect-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---reload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --redirect-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---remix-svg: url('data:image/svg+xml;charset=UTF-8,'); + --reload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---repeat-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --reload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---repeat-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --repeat-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---replication-direct-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --repeat-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---replication-direct-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-direct-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---replication-perf-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-direct-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---replication-perf-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-perf-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rewind-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --replication-perf-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rewind-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rewind-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---ribbon-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rewind-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rocket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rocket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rocket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rocket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rotate-ccw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-ccw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rotate-ccw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-ccw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rotate-cw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-cw-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rotate-cw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rotate-cw-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rss-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rss-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---rss-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --rss-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---run-svg: url('data:image/svg+xml;charset=UTF-8,'); + --run-svg: url('data:image/svg+xml;charset=UTF-8,'); ---save-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --save-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---save-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --save-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---scissors-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --scissors-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---scissors-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --scissors-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---search-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --search-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---search-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --search-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---search-color-svg: url('data:image/svg+xml;charset=UTF-8,'); + --search-color-svg: url('data:image/svg+xml;charset=UTF-8,'); ---search-svg: url('data:image/svg+xml;charset=UTF-8,'); + --send-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---send-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --send-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---send-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---server-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---server-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-cluster-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---server-cluster-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --server-cluster-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---server-cluster-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --serverless-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---serverless-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --serverless-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---serverless-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --settings-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---settings-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --settings-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---settings-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --share-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---settings-svg: url('data:image/svg+xml;charset=UTF-8,'); + --share-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---share-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---share-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shield-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-bag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shield-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-bag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shopping-bag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-cart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shopping-bag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shopping-cart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shopping-cart-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shuffle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shopping-cart-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --shuffle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shuffle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---shuffle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sidebar-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-hide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sidebar-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-hide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sidebar-hide-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-show-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sidebar-hide-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sidebar-show-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sidebar-show-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sidebar-show-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sign-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sign-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sign-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sign-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sign-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---skip-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-back-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---skip-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-back-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---skip-back-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---skip-back-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --skip-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---skip-forward-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---skip-forward-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slack-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slack-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slack-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slack-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slack-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --slash-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slash-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sliders-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---slash-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sliders-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sliders-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smartphone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sliders-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smartphone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---smartphone-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smile-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---smartphone-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --smile-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---smile-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --socket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---smile-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --socket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---socket-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --socket-svg: url('data:image/svg+xml;charset=UTF-8,'); ---socket-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-asc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---socket-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-asc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sort-asc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-desc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sort-asc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sort-desc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sort-desc-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --speaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sort-desc-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --speaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sort-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---source-file-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---speaker-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---speaker-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --star-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --stop-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --stop-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sun-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sun-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --support-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---star-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --support-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---stop-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---stop-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sub-left-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sub-right-svg: url('data:image/svg+xml;charset=UTF-8,'); + --swap-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sun-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --switcher-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sun-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --switcher-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---support-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---support-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---support-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---swap-horizontal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---swap-horizontal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-reverse-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---swap-horizontal-svg: url('data:image/svg+xml;charset=UTF-8,'); + --sync-reverse-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---swap-vertical-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tablet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---swap-vertical-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tablet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---swap-vertical-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---switcher-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---switcher-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --target-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sync-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --target-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sync-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sync-alert-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sync-alert-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-screen-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sync-reverse-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terminal-screen-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---sync-reverse-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terraform-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tablet-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terraform-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tablet-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terraform-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tag-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --terraform-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tag-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tag-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---target-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---target-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --thumbs-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---terminal-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---terminal-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---terminal-screen-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---terminal-screen-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --toggle-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---thumbs-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --token-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---thumbs-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --token-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---thumbs-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tools-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---thumbs-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tools-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---toggle-left-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --top-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---toggle-left-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --top-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---toggle-right-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---toggle-right-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---token-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---token-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tools-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tools-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --trend-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---top-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---top-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trash-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trash-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trash-svg: url('data:image/svg+xml;charset=UTF-8,'); + --truck-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trend-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --truck-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trend-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tv-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trend-up-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --tv-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---trend-up-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---triangle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---triangle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitch-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---triangle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitch-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---triangle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitter-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---truck-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitter-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---truck-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitter-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tune-svg: url('data:image/svg+xml;charset=UTF-8,'); + --twitter-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tv-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --type-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---tv-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --type-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---type-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-close-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---type-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-close-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unfold-close-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unfold-close-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unfold-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unfold-less-svg: url('data:image/svg+xml;charset=UTF-8,'); + --union-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unfold-more-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unlock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unfold-open-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --unlock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unfold-open-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unlock-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---unlock-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---upload-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---upload-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---upload-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-add-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-check-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-check-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-minus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --user-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-minus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-organization-svg: url('data:image/svg+xml;charset=UTF-8,'); + --users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-plain-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vagrant-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-plus-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vagrant-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-plus-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vagrant-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-square-fill-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vagrant-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-square-outline-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vault-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-team-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vault-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vault-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---user-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vault-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---users-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --verified-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---users-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --verified-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---vault-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---vault-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---verified-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---verified-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --video-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---video-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---video-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---video-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---video-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --vmware-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---visibility-hide-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---visibility-show-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-2-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---vmware-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-2-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---vmware-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---vmware-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---vmware-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-2-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --volume-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-2-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wall-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wall-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-down-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --watch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-down-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --watch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --waypoint-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---volume-x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --waypoint-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wall-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --waypoint-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wall-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --waypoint-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---watch-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --webhook-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---watch-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --webhook-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---webhook-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---webhook-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---webhook-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wifi-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wifi-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wifi-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wrench-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wifi-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --wrench-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wifi-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wrench-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---wrench-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-circle-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-circle-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-circle-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-circle-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-diamond-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-diamond-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-diamond-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-diamond-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-hexagon-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-hexagon-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-hexagon-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-hexagon-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-square-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --x-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-square-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --youtube-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-square-fill-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --youtube-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---x-square-fill-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --youtube-color-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zap-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --youtube-color-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zap-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zap-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zap-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-off-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zoom-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zap-off-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zoom-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-in-16-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zoom-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-in-24-svg: url('data:image/svg+xml;charset=UTF-8,'); ---zoom-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-out-16-svg: url('data:image/svg+xml;charset=UTF-8,'); + --zoom-out-24-svg: url('data:image/svg+xml;charset=UTF-8,'); } diff --git a/ui/packages/consul-ui/app/styles/base/icons/icon-placeholders.scss b/ui/packages/consul-ui/app/styles/base/icons/icon-placeholders.scss index 9669a0450b..6bbfd486b3 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/icon-placeholders.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/icon-placeholders.scss @@ -59,23 +59,23 @@ } %with-alert-circle-fill-icon { - @extend %with-icon, %alert-circle-fill-svg-prop; - background-image: var(--alert-circle-fill-svg); + @extend %with-icon, %alert-circle-16-svg-prop; + background-image: var(--alert-circle-16-svg); } %with-alert-circle-fill-mask { - @extend %with-mask, %alert-circle-fill-svg-prop; - -webkit-mask-image: var(--alert-circle-fill-svg); - mask-image: var(--alert-circle-fill-svg); + @extend %with-mask, %alert-circle-16-svg-prop; + -webkit-mask-image: var(--alert-circle-16-svg); + mask-image: var(--alert-circle-16-svg); } %with-alert-circle-outline-icon { - @extend %with-icon, %alert-circle-outline-svg-prop; - background-image: var(--alert-circle-outline-svg); + @extend %with-icon, %alert-circle-16-svg-prop; + background-image: var(--alert-circle-16-svg); } %with-alert-circle-outline-mask { - @extend %with-mask, %alert-circle-outline-svg-prop; - -webkit-mask-image: var(--alert-circle-outline-svg); - mask-image: var(--alert-circle-outline-svg); + @extend %with-mask, %alert-circle-16-svg-prop; + -webkit-mask-image: var(--alert-circle-16-svg); + mask-image: var(--alert-circle-16-svg); } %with-alert-octagon-16-icon { @@ -159,13 +159,13 @@ } %with-alert-triangle-icon { - @extend %with-icon, %alert-triangle-svg-prop; - background-image: var(--alert-triangle-svg); + @extend %with-icon, %alert-triangle-16-svg-prop; + background-image: var(--alert-triangle-16-svg); } %with-alert-triangle-mask { - @extend %with-mask, %alert-triangle-svg-prop; - -webkit-mask-image: var(--alert-triangle-svg); - mask-image: var(--alert-triangle-svg); + @extend %with-mask, %alert-triangle-16-svg-prop; + -webkit-mask-image: var(--alert-triangle-16-svg); + mask-image: var(--alert-triangle-16-svg); } %with-alibaba-16-icon { @@ -288,6 +288,46 @@ mask-image: var(--align-right-24-svg); } +%with-amazon-eks-16-icon { + @extend %with-icon, %amazon-eks-16-svg-prop; + background-image: var(--amazon-eks-16-svg); +} +%with-amazon-eks-16-mask { + @extend %with-mask, %amazon-eks-16-svg-prop; + -webkit-mask-image: var(--amazon-eks-16-svg); + mask-image: var(--amazon-eks-16-svg); +} + +%with-amazon-eks-24-icon { + @extend %with-icon, %amazon-eks-24-svg-prop; + background-image: var(--amazon-eks-24-svg); +} +%with-amazon-eks-24-mask { + @extend %with-mask, %amazon-eks-24-svg-prop; + -webkit-mask-image: var(--amazon-eks-24-svg); + mask-image: var(--amazon-eks-24-svg); +} + +%with-amazon-eks-color-16-icon { + @extend %with-icon, %amazon-eks-color-16-svg-prop; + background-image: var(--amazon-eks-color-16-svg); +} +%with-amazon-eks-color-16-mask { + @extend %with-mask, %amazon-eks-color-16-svg-prop; + -webkit-mask-image: var(--amazon-eks-color-16-svg); + mask-image: var(--amazon-eks-color-16-svg); +} + +%with-amazon-eks-color-24-icon { + @extend %with-icon, %amazon-eks-color-24-svg-prop; + background-image: var(--amazon-eks-color-24-svg); +} +%with-amazon-eks-color-24-mask { + @extend %with-mask, %amazon-eks-color-24-svg-prop; + -webkit-mask-image: var(--amazon-eks-color-24-svg); + mask-image: var(--amazon-eks-color-24-svg); +} + %with-apple-16-icon { @extend %with-icon, %apple-16-svg-prop; background-image: var(--apple-16-svg); @@ -429,13 +469,13 @@ } %with-arrow-down-icon { - @extend %with-icon, %arrow-down-svg-prop; - background-image: var(--arrow-down-svg); + @extend %with-icon, %arrow-down-16-svg-prop; + background-image: var(--arrow-down-16-svg); } %with-arrow-down-mask { - @extend %with-mask, %arrow-down-svg-prop; - -webkit-mask-image: var(--arrow-down-svg); - mask-image: var(--arrow-down-svg); + @extend %with-mask, %arrow-down-16-svg-prop; + -webkit-mask-image: var(--arrow-down-16-svg); + mask-image: var(--arrow-down-16-svg); } %with-arrow-left-16-icon { @@ -479,13 +519,13 @@ } %with-arrow-left-icon { - @extend %with-icon, %arrow-left-svg-prop; - background-image: var(--arrow-left-svg); + @extend %with-icon, %arrow-left-16-svg-prop; + background-image: var(--arrow-left-16-svg); } %with-arrow-left-mask { - @extend %with-mask, %arrow-left-svg-prop; - -webkit-mask-image: var(--arrow-left-svg); - mask-image: var(--arrow-left-svg); + @extend %with-mask, %arrow-left-16-svg-prop; + -webkit-mask-image: var(--arrow-left-16-svg); + mask-image: var(--arrow-left-16-svg); } %with-arrow-right-16-icon { @@ -529,13 +569,13 @@ } %with-arrow-right-icon { - @extend %with-icon, %arrow-right-svg-prop; - background-image: var(--arrow-right-svg); + @extend %with-icon, %arrow-right-16-svg-prop; + background-image: var(--arrow-right-16-svg); } %with-arrow-right-mask { - @extend %with-mask, %arrow-right-svg-prop; - -webkit-mask-image: var(--arrow-right-svg); - mask-image: var(--arrow-right-svg); + @extend %with-mask, %arrow-right-16-svg-prop; + -webkit-mask-image: var(--arrow-right-16-svg); + mask-image: var(--arrow-right-16-svg); } %with-arrow-up-16-icon { @@ -619,13 +659,13 @@ } %with-arrow-up-icon { - @extend %with-icon, %arrow-up-svg-prop; - background-image: var(--arrow-up-svg); + @extend %with-icon, %arrow-up-16-svg-prop; + background-image: var(--arrow-up-16-svg); } %with-arrow-up-mask { - @extend %with-mask, %arrow-up-svg-prop; - -webkit-mask-image: var(--arrow-up-svg); - mask-image: var(--arrow-up-svg); + @extend %with-mask, %arrow-up-16-svg-prop; + -webkit-mask-image: var(--arrow-up-16-svg); + mask-image: var(--arrow-up-16-svg); } %with-at-sign-16-icon { @@ -768,6 +808,46 @@ mask-image: var(--aws-color-24-svg); } +%with-aws-ec2-16-icon { + @extend %with-icon, %aws-ec2-16-svg-prop; + background-image: var(--aws-ec2-16-svg); +} +%with-aws-ec2-16-mask { + @extend %with-mask, %aws-ec2-16-svg-prop; + -webkit-mask-image: var(--aws-ec2-16-svg); + mask-image: var(--aws-ec2-16-svg); +} + +%with-aws-ec2-24-icon { + @extend %with-icon, %aws-ec2-24-svg-prop; + background-image: var(--aws-ec2-24-svg); +} +%with-aws-ec2-24-mask { + @extend %with-mask, %aws-ec2-24-svg-prop; + -webkit-mask-image: var(--aws-ec2-24-svg); + mask-image: var(--aws-ec2-24-svg); +} + +%with-aws-ec2-color-16-icon { + @extend %with-icon, %aws-ec2-color-16-svg-prop; + background-image: var(--aws-ec2-color-16-svg); +} +%with-aws-ec2-color-16-mask { + @extend %with-mask, %aws-ec2-color-16-svg-prop; + -webkit-mask-image: var(--aws-ec2-color-16-svg); + mask-image: var(--aws-ec2-color-16-svg); +} + +%with-aws-ec2-color-24-icon { + @extend %with-icon, %aws-ec2-color-24-svg-prop; + background-image: var(--aws-ec2-color-24-svg); +} +%with-aws-ec2-color-24-mask { + @extend %with-mask, %aws-ec2-color-24-svg-prop; + -webkit-mask-image: var(--aws-ec2-color-24-svg); + mask-image: var(--aws-ec2-color-24-svg); +} + %with-azure-16-icon { @extend %with-icon, %azure-16-svg-prop; background-image: var(--azure-16-svg); @@ -848,6 +928,26 @@ mask-image: var(--azure-devops-color-24-svg); } +%with-bank-vault-16-icon { + @extend %with-icon, %bank-vault-16-svg-prop; + background-image: var(--bank-vault-16-svg); +} +%with-bank-vault-16-mask { + @extend %with-mask, %bank-vault-16-svg-prop; + -webkit-mask-image: var(--bank-vault-16-svg); + mask-image: var(--bank-vault-16-svg); +} + +%with-bank-vault-24-icon { + @extend %with-icon, %bank-vault-24-svg-prop; + background-image: var(--bank-vault-24-svg); +} +%with-bank-vault-24-mask { + @extend %with-mask, %bank-vault-24-svg-prop; + -webkit-mask-image: var(--bank-vault-24-svg); + mask-image: var(--bank-vault-24-svg); +} + %with-bar-chart-16-icon { @extend %with-icon, %bar-chart-16-svg-prop; background-image: var(--bar-chart-16-svg); @@ -1069,13 +1169,13 @@ } %with-bolt-icon { - @extend %with-icon, %bolt-svg-prop; - background-image: var(--bolt-svg); + @extend %with-icon, %zap-16-svg-prop; + background-image: var(--zap-16-svg); } %with-bolt-mask { - @extend %with-mask, %bolt-svg-prop; - -webkit-mask-image: var(--bolt-svg); - mask-image: var(--bolt-svg); + @extend %with-mask, %zap-16-svg-prop; + -webkit-mask-image: var(--zap-16-svg); + mask-image: var(--zap-16-svg); } %with-bookmark-16-icon { @@ -1218,6 +1318,46 @@ mask-image: var(--bottom-24-svg); } +%with-boundary-16-icon { + @extend %with-icon, %boundary-16-svg-prop; + background-image: var(--boundary-16-svg); +} +%with-boundary-16-mask { + @extend %with-mask, %boundary-16-svg-prop; + -webkit-mask-image: var(--boundary-16-svg); + mask-image: var(--boundary-16-svg); +} + +%with-boundary-24-icon { + @extend %with-icon, %boundary-24-svg-prop; + background-image: var(--boundary-24-svg); +} +%with-boundary-24-mask { + @extend %with-mask, %boundary-24-svg-prop; + -webkit-mask-image: var(--boundary-24-svg); + mask-image: var(--boundary-24-svg); +} + +%with-boundary-color-16-icon { + @extend %with-icon, %boundary-color-16-svg-prop; + background-image: var(--boundary-color-16-svg); +} +%with-boundary-color-16-mask { + @extend %with-mask, %boundary-color-16-svg-prop; + -webkit-mask-image: var(--boundary-color-16-svg); + mask-image: var(--boundary-color-16-svg); +} + +%with-boundary-color-24-icon { + @extend %with-icon, %boundary-color-24-svg-prop; + background-image: var(--boundary-color-24-svg); +} +%with-boundary-color-24-mask { + @extend %with-mask, %boundary-color-24-svg-prop; + -webkit-mask-image: var(--boundary-color-24-svg); + mask-image: var(--boundary-color-24-svg); +} + %with-box-16-icon { @extend %with-icon, %box-16-svg-prop; background-image: var(--box-16-svg); @@ -1239,23 +1379,23 @@ } %with-box-check-fill-icon { - @extend %with-icon, %box-check-fill-svg-prop; - background-image: var(--box-check-fill-svg); + @extend %with-icon, %check-square-fill-16-svg-prop; + background-image: var(--check-square-fill-16-svg); } %with-box-check-fill-mask { - @extend %with-mask, %box-check-fill-svg-prop; - -webkit-mask-image: var(--box-check-fill-svg); - mask-image: var(--box-check-fill-svg); + @extend %with-mask, %check-square-fill-16-svg-prop; + -webkit-mask-image: var(--check-square-fill-16-svg); + mask-image: var(--check-square-fill-16-svg); } %with-box-outline-icon { - @extend %with-icon, %box-outline-svg-prop; - background-image: var(--box-outline-svg); + @extend %with-icon, %square-16-svg-prop; + background-image: var(--square-16-svg); } %with-box-outline-mask { - @extend %with-mask, %box-outline-svg-prop; - -webkit-mask-image: var(--box-outline-svg); - mask-image: var(--box-outline-svg); + @extend %with-mask, %square-16-svg-prop; + -webkit-mask-image: var(--square-16-svg); + mask-image: var(--square-16-svg); } %with-briefcase-16-icon { @@ -1279,13 +1419,13 @@ } %with-broadcast-icon { - @extend %with-icon, %broadcast-svg-prop; - background-image: var(--broadcast-svg); + @extend %with-icon, %radio-16-svg-prop; + background-image: var(--radio-16-svg); } %with-broadcast-mask { - @extend %with-mask, %broadcast-svg-prop; - -webkit-mask-image: var(--broadcast-svg); - mask-image: var(--broadcast-svg); + @extend %with-mask, %radio-16-svg-prop; + -webkit-mask-image: var(--radio-16-svg); + mask-image: var(--radio-16-svg); } %with-bug-16-icon { @@ -1309,13 +1449,13 @@ } %with-bug-icon { - @extend %with-icon, %bug-svg-prop; - background-image: var(--bug-svg); + @extend %with-icon, %bug-16-svg-prop; + background-image: var(--bug-16-svg); } %with-bug-mask { - @extend %with-mask, %bug-svg-prop; - -webkit-mask-image: var(--bug-svg); - mask-image: var(--bug-svg); + @extend %with-mask, %bug-16-svg-prop; + -webkit-mask-image: var(--bug-16-svg); + mask-image: var(--bug-16-svg); } %with-build-16-icon { @@ -1359,13 +1499,13 @@ } %with-calendar-icon { - @extend %with-icon, %calendar-svg-prop; - background-image: var(--calendar-svg); + @extend %with-icon, %calendar-16-svg-prop; + background-image: var(--calendar-16-svg); } %with-calendar-mask { - @extend %with-mask, %calendar-svg-prop; - -webkit-mask-image: var(--calendar-svg); - mask-image: var(--calendar-svg); + @extend %with-mask, %calendar-16-svg-prop; + -webkit-mask-image: var(--calendar-16-svg); + mask-image: var(--calendar-16-svg); } %with-camera-16-icon { @@ -1409,53 +1549,53 @@ } %with-cancel-circle-fill-icon { - @extend %with-icon, %cancel-circle-fill-svg-prop; - background-image: var(--cancel-circle-fill-svg); + @extend %with-icon, %x-circle-fill-16-svg-prop; + background-image: var(--x-circle-fill-16-svg); } %with-cancel-circle-fill-mask { - @extend %with-mask, %cancel-circle-fill-svg-prop; - -webkit-mask-image: var(--cancel-circle-fill-svg); - mask-image: var(--cancel-circle-fill-svg); + @extend %with-mask, %x-circle-fill-16-svg-prop; + -webkit-mask-image: var(--x-circle-fill-16-svg); + mask-image: var(--x-circle-fill-16-svg); } %with-cancel-circle-outline-icon { - @extend %with-icon, %cancel-circle-outline-svg-prop; - background-image: var(--cancel-circle-outline-svg); + @extend %with-icon, %x-circle-16-svg-prop; + background-image: var(--x-circle-16-svg); } %with-cancel-circle-outline-mask { - @extend %with-mask, %cancel-circle-outline-svg-prop; - -webkit-mask-image: var(--cancel-circle-outline-svg); - mask-image: var(--cancel-circle-outline-svg); + @extend %with-mask, %x-circle-16-svg-prop; + -webkit-mask-image: var(--x-circle-16-svg); + mask-image: var(--x-circle-16-svg); } %with-cancel-plain-icon { - @extend %with-icon, %cancel-plain-svg-prop; - background-image: var(--cancel-plain-svg); + @extend %with-icon, %x-16-svg-prop; + background-image: var(--x-16-svg); } %with-cancel-plain-mask { - @extend %with-mask, %cancel-plain-svg-prop; - -webkit-mask-image: var(--cancel-plain-svg); - mask-image: var(--cancel-plain-svg); + @extend %with-mask, %x-16-svg-prop; + -webkit-mask-image: var(--x-16-svg); + mask-image: var(--x-16-svg); } %with-cancel-square-fill-icon { - @extend %with-icon, %cancel-square-fill-svg-prop; - background-image: var(--cancel-square-fill-svg); + @extend %with-icon, %x-square-fill-16-svg-prop; + background-image: var(--x-square-fill-16-svg); } %with-cancel-square-fill-mask { - @extend %with-mask, %cancel-square-fill-svg-prop; - -webkit-mask-image: var(--cancel-square-fill-svg); - mask-image: var(--cancel-square-fill-svg); + @extend %with-mask, %x-square-fill-16-svg-prop; + -webkit-mask-image: var(--x-square-fill-16-svg); + mask-image: var(--x-square-fill-16-svg); } %with-cancel-square-outline-icon { - @extend %with-icon, %cancel-square-outline-svg-prop; - background-image: var(--cancel-square-outline-svg); + @extend %with-icon, %x-square-16-svg-prop; + background-image: var(--x-square-16-svg); } %with-cancel-square-outline-mask { - @extend %with-mask, %cancel-square-outline-svg-prop; - -webkit-mask-image: var(--cancel-square-outline-svg); - mask-image: var(--cancel-square-outline-svg); + @extend %with-mask, %x-square-16-svg-prop; + -webkit-mask-image: var(--x-square-16-svg); + mask-image: var(--x-square-16-svg); } %with-caret-16-icon { @@ -1479,23 +1619,23 @@ } %with-caret-down-icon { - @extend %with-icon, %caret-down-svg-prop; - background-image: var(--caret-down-svg); + @extend %with-icon, %caret-16-svg-prop; + background-image: var(--caret-16-svg); } %with-caret-down-mask { - @extend %with-mask, %caret-down-svg-prop; - -webkit-mask-image: var(--caret-down-svg); - mask-image: var(--caret-down-svg); + @extend %with-mask, %caret-16-svg-prop; + -webkit-mask-image: var(--caret-16-svg); + mask-image: var(--caret-16-svg); } %with-caret-up-icon { - @extend %with-icon, %caret-up-svg-prop; - background-image: var(--caret-up-svg); + @extend %with-icon, %chevron-up-16-svg-prop; + background-image: var(--chevron-up-16-svg); } %with-caret-up-mask { - @extend %with-mask, %caret-up-svg-prop; - -webkit-mask-image: var(--caret-up-svg); - mask-image: var(--caret-up-svg); + @extend %with-mask, %chevron-up-16-svg-prop; + -webkit-mask-image: var(--chevron-up-16-svg); + mask-image: var(--chevron-up-16-svg); } %with-cast-16-icon { @@ -1659,23 +1799,23 @@ } %with-check-circle-fill-icon { - @extend %with-icon, %check-circle-fill-svg-prop; - background-image: var(--check-circle-fill-svg); + @extend %with-icon, %check-circle-fill-16-svg-prop; + background-image: var(--check-circle-fill-16-svg); } %with-check-circle-fill-mask { - @extend %with-mask, %check-circle-fill-svg-prop; - -webkit-mask-image: var(--check-circle-fill-svg); - mask-image: var(--check-circle-fill-svg); + @extend %with-mask, %check-circle-fill-16-svg-prop; + -webkit-mask-image: var(--check-circle-fill-16-svg); + mask-image: var(--check-circle-fill-16-svg); } %with-check-circle-outline-icon { - @extend %with-icon, %check-circle-outline-svg-prop; - background-image: var(--check-circle-outline-svg); + @extend %with-icon, %check-circle-16-svg-prop; + background-image: var(--check-circle-16-svg); } %with-check-circle-outline-mask { - @extend %with-mask, %check-circle-outline-svg-prop; - -webkit-mask-image: var(--check-circle-outline-svg); - mask-image: var(--check-circle-outline-svg); + @extend %with-mask, %check-circle-16-svg-prop; + -webkit-mask-image: var(--check-circle-16-svg); + mask-image: var(--check-circle-16-svg); } %with-check-diamond-16-icon { @@ -1759,13 +1899,13 @@ } %with-check-plain-icon { - @extend %with-icon, %check-plain-svg-prop; - background-image: var(--check-plain-svg); + @extend %with-icon, %check-16-svg-prop; + background-image: var(--check-16-svg); } %with-check-plain-mask { - @extend %with-mask, %check-plain-svg-prop; - -webkit-mask-image: var(--check-plain-svg); - mask-image: var(--check-plain-svg); + @extend %with-mask, %check-16-svg-prop; + -webkit-mask-image: var(--check-16-svg); + mask-image: var(--check-16-svg); } %with-check-square-16-icon { @@ -1829,13 +1969,13 @@ } %with-chevron-down-icon { - @extend %with-icon, %chevron-down-svg-prop; - background-image: var(--chevron-down-svg); + @extend %with-icon, %chevron-down-16-svg-prop; + background-image: var(--chevron-down-16-svg); } %with-chevron-down-mask { - @extend %with-mask, %chevron-down-svg-prop; - -webkit-mask-image: var(--chevron-down-svg); - mask-image: var(--chevron-down-svg); + @extend %with-mask, %chevron-down-16-svg-prop; + -webkit-mask-image: var(--chevron-down-16-svg); + mask-image: var(--chevron-down-16-svg); } %with-chevron-left-16-icon { @@ -1859,13 +1999,13 @@ } %with-chevron-left-icon { - @extend %with-icon, %chevron-left-svg-prop; - background-image: var(--chevron-left-svg); + @extend %with-icon, %chevron-left-16-svg-prop; + background-image: var(--chevron-left-16-svg); } %with-chevron-left-mask { - @extend %with-mask, %chevron-left-svg-prop; - -webkit-mask-image: var(--chevron-left-svg); - mask-image: var(--chevron-left-svg); + @extend %with-mask, %chevron-left-16-svg-prop; + -webkit-mask-image: var(--chevron-left-16-svg); + mask-image: var(--chevron-left-16-svg); } %with-chevron-right-16-icon { @@ -1889,13 +2029,13 @@ } %with-chevron-right-icon { - @extend %with-icon, %chevron-right-svg-prop; - background-image: var(--chevron-right-svg); + @extend %with-icon, %chevron-right-16-svg-prop; + background-image: var(--chevron-right-16-svg); } %with-chevron-right-mask { - @extend %with-mask, %chevron-right-svg-prop; - -webkit-mask-image: var(--chevron-right-svg); - mask-image: var(--chevron-right-svg); + @extend %with-mask, %chevron-right-16-svg-prop; + -webkit-mask-image: var(--chevron-right-16-svg); + mask-image: var(--chevron-right-16-svg); } %with-chevron-up-16-icon { @@ -1919,13 +2059,13 @@ } %with-chevron-up-icon { - @extend %with-icon, %chevron-up-svg-prop; - background-image: var(--chevron-up-svg); + @extend %with-icon, %chevron-up-16-svg-prop; + background-image: var(--chevron-up-16-svg); } %with-chevron-up-mask { - @extend %with-mask, %chevron-up-svg-prop; - -webkit-mask-image: var(--chevron-up-svg); - mask-image: var(--chevron-up-svg); + @extend %with-mask, %chevron-up-16-svg-prop; + -webkit-mask-image: var(--chevron-up-16-svg); + mask-image: var(--chevron-up-16-svg); } %with-chevrons-down-16-icon { @@ -2169,23 +2309,23 @@ } %with-clock-fill-icon { - @extend %with-icon, %clock-fill-svg-prop; - background-image: var(--clock-fill-svg); + @extend %with-icon, %clock-16-svg-prop; + background-image: var(--clock-16-svg); } %with-clock-fill-mask { - @extend %with-mask, %clock-fill-svg-prop; - -webkit-mask-image: var(--clock-fill-svg); - mask-image: var(--clock-fill-svg); + @extend %with-mask, %clock-16-svg-prop; + -webkit-mask-image: var(--clock-16-svg); + mask-image: var(--clock-16-svg); } %with-clock-outline-icon { - @extend %with-icon, %clock-outline-svg-prop; - background-image: var(--clock-outline-svg); + @extend %with-icon, %clock-16-svg-prop; + background-image: var(--clock-16-svg); } %with-clock-outline-mask { - @extend %with-mask, %clock-outline-svg-prop; - -webkit-mask-image: var(--clock-outline-svg); - mask-image: var(--clock-outline-svg); + @extend %with-mask, %clock-16-svg-prop; + -webkit-mask-image: var(--clock-16-svg); + mask-image: var(--clock-16-svg); } %with-cloud-16-icon { @@ -2379,13 +2519,53 @@ } %with-code-icon { - @extend %with-icon, %code-svg-prop; - background-image: var(--code-svg); + @extend %with-icon, %code-16-svg-prop; + background-image: var(--code-16-svg); } %with-code-mask { - @extend %with-mask, %code-svg-prop; - -webkit-mask-image: var(--code-svg); - mask-image: var(--code-svg); + @extend %with-mask, %code-16-svg-prop; + -webkit-mask-image: var(--code-16-svg); + mask-image: var(--code-16-svg); +} + +%with-codepen-16-icon { + @extend %with-icon, %codepen-16-svg-prop; + background-image: var(--codepen-16-svg); +} +%with-codepen-16-mask { + @extend %with-mask, %codepen-16-svg-prop; + -webkit-mask-image: var(--codepen-16-svg); + mask-image: var(--codepen-16-svg); +} + +%with-codepen-24-icon { + @extend %with-icon, %codepen-24-svg-prop; + background-image: var(--codepen-24-svg); +} +%with-codepen-24-mask { + @extend %with-mask, %codepen-24-svg-prop; + -webkit-mask-image: var(--codepen-24-svg); + mask-image: var(--codepen-24-svg); +} + +%with-codepen-color-16-icon { + @extend %with-icon, %codepen-color-16-svg-prop; + background-image: var(--codepen-color-16-svg); +} +%with-codepen-color-16-mask { + @extend %with-mask, %codepen-color-16-svg-prop; + -webkit-mask-image: var(--codepen-color-16-svg); + mask-image: var(--codepen-color-16-svg); +} + +%with-codepen-color-24-icon { + @extend %with-icon, %codepen-color-24-svg-prop; + background-image: var(--codepen-color-24-svg); +} +%with-codepen-color-24-mask { + @extend %with-mask, %codepen-color-24-svg-prop; + -webkit-mask-image: var(--codepen-color-24-svg); + mask-image: var(--codepen-color-24-svg); } %with-collections-16-icon { @@ -2489,33 +2669,73 @@ } %with-console-icon { - @extend %with-icon, %console-svg-prop; - background-image: var(--console-svg); + @extend %with-icon, %terminal-16-svg-prop; + background-image: var(--terminal-16-svg); } %with-console-mask { - @extend %with-mask, %console-svg-prop; - -webkit-mask-image: var(--console-svg); - mask-image: var(--console-svg); + @extend %with-mask, %terminal-16-svg-prop; + -webkit-mask-image: var(--terminal-16-svg); + mask-image: var(--terminal-16-svg); +} + +%with-consul-16-icon { + @extend %with-icon, %consul-16-svg-prop; + background-image: var(--consul-16-svg); +} +%with-consul-16-mask { + @extend %with-mask, %consul-16-svg-prop; + -webkit-mask-image: var(--consul-16-svg); + mask-image: var(--consul-16-svg); +} + +%with-consul-24-icon { + @extend %with-icon, %consul-24-svg-prop; + background-image: var(--consul-24-svg); +} +%with-consul-24-mask { + @extend %with-mask, %consul-24-svg-prop; + -webkit-mask-image: var(--consul-24-svg); + mask-image: var(--consul-24-svg); +} + +%with-consul-color-16-icon { + @extend %with-icon, %consul-color-16-svg-prop; + background-image: var(--consul-color-16-svg); +} +%with-consul-color-16-mask { + @extend %with-mask, %consul-color-16-svg-prop; + -webkit-mask-image: var(--consul-color-16-svg); + mask-image: var(--consul-color-16-svg); +} + +%with-consul-color-24-icon { + @extend %with-icon, %consul-color-24-svg-prop; + background-image: var(--consul-color-24-svg); +} +%with-consul-color-24-mask { + @extend %with-mask, %consul-color-24-svg-prop; + -webkit-mask-image: var(--consul-color-24-svg); + mask-image: var(--consul-color-24-svg); } %with-copy-action-icon { - @extend %with-icon, %copy-action-svg-prop; - background-image: var(--copy-action-svg); + @extend %with-icon, %clipboard-copy-16-svg-prop; + background-image: var(--clipboard-copy-16-svg); } %with-copy-action-mask { - @extend %with-mask, %copy-action-svg-prop; - -webkit-mask-image: var(--copy-action-svg); - mask-image: var(--copy-action-svg); + @extend %with-mask, %clipboard-copy-16-svg-prop; + -webkit-mask-image: var(--clipboard-copy-16-svg); + mask-image: var(--clipboard-copy-16-svg); } %with-copy-success-icon { - @extend %with-icon, %copy-success-svg-prop; - background-image: var(--copy-success-svg); + @extend %with-icon, %clipboard-checked-16-svg-prop; + background-image: var(--clipboard-checked-16-svg); } %with-copy-success-mask { - @extend %with-mask, %copy-success-svg-prop; - -webkit-mask-image: var(--copy-success-svg); - mask-image: var(--copy-success-svg); + @extend %with-mask, %clipboard-checked-16-svg-prop; + -webkit-mask-image: var(--clipboard-checked-16-svg); + mask-image: var(--clipboard-checked-16-svg); } %with-corner-down-left-16-icon { @@ -2799,13 +3019,13 @@ } %with-database-icon { - @extend %with-icon, %database-svg-prop; - background-image: var(--database-svg); + @extend %with-icon, %database-16-svg-prop; + background-image: var(--database-16-svg); } %with-database-mask { - @extend %with-mask, %database-svg-prop; - -webkit-mask-image: var(--database-svg); - mask-image: var(--database-svg); + @extend %with-mask, %database-16-svg-prop; + -webkit-mask-image: var(--database-16-svg); + mask-image: var(--database-16-svg); } %with-delay-16-icon { @@ -2829,13 +3049,13 @@ } %with-delay-icon { - @extend %with-icon, %delay-svg-prop; - background-image: var(--delay-svg); + @extend %with-icon, %delay-16-svg-prop; + background-image: var(--delay-16-svg); } %with-delay-mask { - @extend %with-mask, %delay-svg-prop; - -webkit-mask-image: var(--delay-svg); - mask-image: var(--delay-svg); + @extend %with-mask, %delay-16-svg-prop; + -webkit-mask-image: var(--delay-16-svg); + mask-image: var(--delay-16-svg); } %with-delete-16-icon { @@ -2859,13 +3079,13 @@ } %with-deny-alt-icon { - @extend %with-icon, %deny-alt-svg-prop; - background-image: var(--deny-alt-svg); + @extend %with-icon, %skip-16-svg-prop; + background-image: var(--skip-16-svg); } %with-deny-alt-mask { - @extend %with-mask, %deny-alt-svg-prop; - -webkit-mask-image: var(--deny-alt-svg); - mask-image: var(--deny-alt-svg); + @extend %with-mask, %skip-16-svg-prop; + -webkit-mask-image: var(--skip-16-svg); + mask-image: var(--skip-16-svg); } %with-deny-color-icon { @@ -2879,13 +3099,13 @@ } %with-deny-default-icon { - @extend %with-icon, %deny-default-svg-prop; - background-image: var(--deny-default-svg); + @extend %with-icon, %skip-16-svg-prop; + background-image: var(--skip-16-svg); } %with-deny-default-mask { - @extend %with-mask, %deny-default-svg-prop; - -webkit-mask-image: var(--deny-default-svg); - mask-image: var(--deny-default-svg); + @extend %with-mask, %skip-16-svg-prop; + -webkit-mask-image: var(--skip-16-svg); + mask-image: var(--skip-16-svg); } %with-diamond-16-icon { @@ -2929,13 +3149,13 @@ } %with-disabled-icon { - @extend %with-icon, %disabled-svg-prop; - background-image: var(--disabled-svg); + @extend %with-icon, %skip-16-svg-prop; + background-image: var(--skip-16-svg); } %with-disabled-mask { - @extend %with-mask, %disabled-svg-prop; - -webkit-mask-image: var(--disabled-svg); - mask-image: var(--disabled-svg); + @extend %with-mask, %skip-16-svg-prop; + -webkit-mask-image: var(--skip-16-svg); + mask-image: var(--skip-16-svg); } %with-disc-16-icon { @@ -3099,13 +3319,13 @@ } %with-docs-icon { - @extend %with-icon, %docs-svg-prop; - background-image: var(--docs-svg); + @extend %with-icon, %docs-link-16-svg-prop; + background-image: var(--docs-link-16-svg); } %with-docs-mask { - @extend %with-mask, %docs-svg-prop; - -webkit-mask-image: var(--docs-svg); - mask-image: var(--docs-svg); + @extend %with-mask, %docs-link-16-svg-prop; + -webkit-mask-image: var(--docs-link-16-svg); + mask-image: var(--docs-link-16-svg); } %with-dollar-sign-16-icon { @@ -3189,13 +3409,13 @@ } %with-download-icon { - @extend %with-icon, %download-svg-prop; - background-image: var(--download-svg); + @extend %with-icon, %download-16-svg-prop; + background-image: var(--download-16-svg); } %with-download-mask { - @extend %with-mask, %download-svg-prop; - -webkit-mask-image: var(--download-svg); - mask-image: var(--download-svg); + @extend %with-mask, %download-16-svg-prop; + -webkit-mask-image: var(--download-16-svg); + mask-image: var(--download-16-svg); } %with-droplet-16-icon { @@ -3259,13 +3479,13 @@ } %with-edit-icon { - @extend %with-icon, %edit-svg-prop; - background-image: var(--edit-svg); + @extend %with-icon, %edit-16-svg-prop; + background-image: var(--edit-16-svg); } %with-edit-mask { - @extend %with-mask, %edit-svg-prop; - -webkit-mask-image: var(--edit-svg); - mask-image: var(--edit-svg); + @extend %with-mask, %edit-16-svg-prop; + -webkit-mask-image: var(--edit-16-svg); + mask-image: var(--edit-16-svg); } %with-entry-point-16-icon { @@ -3289,43 +3509,43 @@ } %with-envelope-sealed-fill-icon { - @extend %with-icon, %envelope-sealed-fill-svg-prop; - background-image: var(--envelope-sealed-fill-svg); + @extend %with-icon, %mail-16-svg-prop; + background-image: var(--mail-16-svg); } %with-envelope-sealed-fill-mask { - @extend %with-mask, %envelope-sealed-fill-svg-prop; - -webkit-mask-image: var(--envelope-sealed-fill-svg); - mask-image: var(--envelope-sealed-fill-svg); + @extend %with-mask, %mail-16-svg-prop; + -webkit-mask-image: var(--mail-16-svg); + mask-image: var(--mail-16-svg); } %with-envelope-sealed-outline-icon { - @extend %with-icon, %envelope-sealed-outline-svg-prop; - background-image: var(--envelope-sealed-outline-svg); + @extend %with-icon, %mail-16-svg-prop; + background-image: var(--mail-16-svg); } %with-envelope-sealed-outline-mask { - @extend %with-mask, %envelope-sealed-outline-svg-prop; - -webkit-mask-image: var(--envelope-sealed-outline-svg); - mask-image: var(--envelope-sealed-outline-svg); + @extend %with-mask, %mail-16-svg-prop; + -webkit-mask-image: var(--mail-16-svg); + mask-image: var(--mail-16-svg); } %with-envelope-unsealed--outline-icon { - @extend %with-icon, %envelope-unsealed--outline-svg-prop; - background-image: var(--envelope-unsealed--outline-svg); + @extend %with-icon, %mail-open-16-svg-prop; + background-image: var(--mail-open-16-svg); } %with-envelope-unsealed--outline-mask { - @extend %with-mask, %envelope-unsealed--outline-svg-prop; - -webkit-mask-image: var(--envelope-unsealed--outline-svg); - mask-image: var(--envelope-unsealed--outline-svg); + @extend %with-mask, %mail-open-16-svg-prop; + -webkit-mask-image: var(--mail-open-16-svg); + mask-image: var(--mail-open-16-svg); } %with-envelope-unsealed-fill-icon { - @extend %with-icon, %envelope-unsealed-fill-svg-prop; - background-image: var(--envelope-unsealed-fill-svg); + @extend %with-icon, %mail-open-16-svg-prop; + background-image: var(--mail-open-16-svg); } %with-envelope-unsealed-fill-mask { - @extend %with-mask, %envelope-unsealed-fill-svg-prop; - -webkit-mask-image: var(--envelope-unsealed-fill-svg); - mask-image: var(--envelope-unsealed-fill-svg); + @extend %with-mask, %mail-open-16-svg-prop; + -webkit-mask-image: var(--mail-open-16-svg); + mask-image: var(--mail-open-16-svg); } %with-event-16-icon { @@ -3369,33 +3589,33 @@ } %with-exit-icon { - @extend %with-icon, %exit-svg-prop; - background-image: var(--exit-svg); + @extend %with-icon, %external-link-16-svg-prop; + background-image: var(--external-link-16-svg); } %with-exit-mask { - @extend %with-mask, %exit-svg-prop; - -webkit-mask-image: var(--exit-svg); - mask-image: var(--exit-svg); + @extend %with-mask, %external-link-16-svg-prop; + -webkit-mask-image: var(--external-link-16-svg); + mask-image: var(--external-link-16-svg); } %with-expand-less-icon { - @extend %with-icon, %expand-less-svg-prop; - background-image: var(--expand-less-svg); + @extend %with-icon, %minimize-16-svg-prop; + background-image: var(--minimize-16-svg); } %with-expand-less-mask { - @extend %with-mask, %expand-less-svg-prop; - -webkit-mask-image: var(--expand-less-svg); - mask-image: var(--expand-less-svg); + @extend %with-mask, %minimize-16-svg-prop; + -webkit-mask-image: var(--minimize-16-svg); + mask-image: var(--minimize-16-svg); } %with-expand-more-icon { - @extend %with-icon, %expand-more-svg-prop; - background-image: var(--expand-more-svg); + @extend %with-icon, %maximize-16-svg-prop; + background-image: var(--maximize-16-svg); } %with-expand-more-mask { - @extend %with-mask, %expand-more-svg-prop; - -webkit-mask-image: var(--expand-more-svg); - mask-image: var(--expand-more-svg); + @extend %with-mask, %maximize-16-svg-prop; + -webkit-mask-image: var(--maximize-16-svg); + mask-image: var(--maximize-16-svg); } %with-external-link-16-icon { @@ -3498,6 +3718,46 @@ mask-image: var(--f5-color-24-svg); } +%with-facebook-16-icon { + @extend %with-icon, %facebook-16-svg-prop; + background-image: var(--facebook-16-svg); +} +%with-facebook-16-mask { + @extend %with-mask, %facebook-16-svg-prop; + -webkit-mask-image: var(--facebook-16-svg); + mask-image: var(--facebook-16-svg); +} + +%with-facebook-24-icon { + @extend %with-icon, %facebook-24-svg-prop; + background-image: var(--facebook-24-svg); +} +%with-facebook-24-mask { + @extend %with-mask, %facebook-24-svg-prop; + -webkit-mask-image: var(--facebook-24-svg); + mask-image: var(--facebook-24-svg); +} + +%with-facebook-color-16-icon { + @extend %with-icon, %facebook-color-16-svg-prop; + background-image: var(--facebook-color-16-svg); +} +%with-facebook-color-16-mask { + @extend %with-mask, %facebook-color-16-svg-prop; + -webkit-mask-image: var(--facebook-color-16-svg); + mask-image: var(--facebook-color-16-svg); +} + +%with-facebook-color-24-icon { + @extend %with-icon, %facebook-color-24-svg-prop; + background-image: var(--facebook-color-24-svg); +} +%with-facebook-color-24-mask { + @extend %with-mask, %facebook-color-24-svg-prop; + -webkit-mask-image: var(--facebook-color-24-svg); + mask-image: var(--facebook-color-24-svg); +} + %with-fast-forward-16-icon { @extend %with-icon, %fast-forward-16-svg-prop; background-image: var(--fast-forward-16-svg); @@ -3599,13 +3859,13 @@ } %with-file-fill-icon { - @extend %with-icon, %file-fill-svg-prop; - background-image: var(--file-fill-svg); + @extend %with-icon, %file-16-svg-prop; + background-image: var(--file-16-svg); } %with-file-fill-mask { - @extend %with-mask, %file-fill-svg-prop; - -webkit-mask-image: var(--file-fill-svg); - mask-image: var(--file-fill-svg); + @extend %with-mask, %file-16-svg-prop; + -webkit-mask-image: var(--file-16-svg); + mask-image: var(--file-16-svg); } %with-file-minus-16-icon { @@ -3629,13 +3889,13 @@ } %with-file-outline-icon { - @extend %with-icon, %file-outline-svg-prop; - background-image: var(--file-outline-svg); + @extend %with-icon, %file-16-svg-prop; + background-image: var(--file-16-svg); } %with-file-outline-mask { - @extend %with-mask, %file-outline-svg-prop; - -webkit-mask-image: var(--file-outline-svg); - mask-image: var(--file-outline-svg); + @extend %with-mask, %file-16-svg-prop; + -webkit-mask-image: var(--file-16-svg); + mask-image: var(--file-16-svg); } %with-file-plus-16-icon { @@ -3819,13 +4079,13 @@ } %with-filter-icon { - @extend %with-icon, %filter-svg-prop; - background-image: var(--filter-svg); + @extend %with-icon, %filter-16-svg-prop; + background-image: var(--filter-16-svg); } %with-filter-mask { - @extend %with-mask, %filter-svg-prop; - -webkit-mask-image: var(--filter-svg); - mask-image: var(--filter-svg); + @extend %with-mask, %filter-16-svg-prop; + -webkit-mask-image: var(--filter-16-svg); + mask-image: var(--filter-16-svg); } %with-fingerprint-16-icon { @@ -3869,13 +4129,13 @@ } %with-flag-icon { - @extend %with-icon, %flag-svg-prop; - background-image: var(--flag-svg); + @extend %with-icon, %flag-16-svg-prop; + background-image: var(--flag-16-svg); } %with-flag-mask { - @extend %with-mask, %flag-svg-prop; - -webkit-mask-image: var(--flag-svg); - mask-image: var(--flag-svg); + @extend %with-mask, %flag-16-svg-prop; + -webkit-mask-image: var(--flag-16-svg); + mask-image: var(--flag-16-svg); } %with-folder-16-icon { @@ -3919,13 +4179,13 @@ } %with-folder-fill-icon { - @extend %with-icon, %folder-fill-svg-prop; - background-image: var(--folder-fill-svg); + @extend %with-icon, %folder-fill-16-svg-prop; + background-image: var(--folder-fill-16-svg); } %with-folder-fill-mask { - @extend %with-mask, %folder-fill-svg-prop; - -webkit-mask-image: var(--folder-fill-svg); - mask-image: var(--folder-fill-svg); + @extend %with-mask, %folder-fill-16-svg-prop; + -webkit-mask-image: var(--folder-fill-16-svg); + mask-image: var(--folder-fill-16-svg); } %with-folder-minus-16-icon { @@ -3969,13 +4229,13 @@ } %with-folder-outline-icon { - @extend %with-icon, %folder-outline-svg-prop; - background-image: var(--folder-outline-svg); + @extend %with-icon, %folder-16-svg-prop; + background-image: var(--folder-16-svg); } %with-folder-outline-mask { - @extend %with-mask, %folder-outline-svg-prop; - -webkit-mask-image: var(--folder-outline-svg); - mask-image: var(--folder-outline-svg); + @extend %with-mask, %folder-16-svg-prop; + -webkit-mask-image: var(--folder-16-svg); + mask-image: var(--folder-16-svg); } %with-folder-plus-16-icon { @@ -4099,13 +4359,13 @@ } %with-gateway-icon { - @extend %with-icon, %gateway-svg-prop; - background-image: var(--gateway-svg); + @extend %with-icon, %gateway-16-svg-prop; + background-image: var(--gateway-16-svg); } %with-gateway-mask { - @extend %with-mask, %gateway-svg-prop; - -webkit-mask-image: var(--gateway-svg); - mask-image: var(--gateway-svg); + @extend %with-mask, %gateway-16-svg-prop; + -webkit-mask-image: var(--gateway-16-svg); + mask-image: var(--gateway-16-svg); } %with-gcp-16-icon { @@ -4169,23 +4429,23 @@ } %with-gift-fill-icon { - @extend %with-icon, %gift-fill-svg-prop; - background-image: var(--gift-fill-svg); + @extend %with-icon, %gift-16-svg-prop; + background-image: var(--gift-16-svg); } %with-gift-fill-mask { - @extend %with-mask, %gift-fill-svg-prop; - -webkit-mask-image: var(--gift-fill-svg); - mask-image: var(--gift-fill-svg); + @extend %with-mask, %gift-16-svg-prop; + -webkit-mask-image: var(--gift-16-svg); + mask-image: var(--gift-16-svg); } %with-gift-outline-icon { - @extend %with-icon, %gift-outline-svg-prop; - background-image: var(--gift-outline-svg); + @extend %with-icon, %gift-16-svg-prop; + background-image: var(--gift-16-svg); } %with-gift-outline-mask { - @extend %with-mask, %gift-outline-svg-prop; - -webkit-mask-image: var(--gift-outline-svg); - mask-image: var(--gift-outline-svg); + @extend %with-mask, %gift-16-svg-prop; + -webkit-mask-image: var(--gift-16-svg); + mask-image: var(--gift-16-svg); } %with-git-branch-16-icon { @@ -4209,13 +4469,13 @@ } %with-git-branch-icon { - @extend %with-icon, %git-branch-svg-prop; - background-image: var(--git-branch-svg); + @extend %with-icon, %git-branch-16-svg-prop; + background-image: var(--git-branch-16-svg); } %with-git-branch-mask { - @extend %with-mask, %git-branch-svg-prop; - -webkit-mask-image: var(--git-branch-svg); - mask-image: var(--git-branch-svg); + @extend %with-mask, %git-branch-16-svg-prop; + -webkit-mask-image: var(--git-branch-16-svg); + mask-image: var(--git-branch-16-svg); } %with-git-commit-16-icon { @@ -4239,13 +4499,13 @@ } %with-git-commit-icon { - @extend %with-icon, %git-commit-svg-prop; - background-image: var(--git-commit-svg); + @extend %with-icon, %git-commit-16-svg-prop; + background-image: var(--git-commit-16-svg); } %with-git-commit-mask { - @extend %with-mask, %git-commit-svg-prop; - -webkit-mask-image: var(--git-commit-svg); - mask-image: var(--git-commit-svg); + @extend %with-mask, %git-commit-16-svg-prop; + -webkit-mask-image: var(--git-commit-16-svg); + mask-image: var(--git-commit-16-svg); } %with-git-merge-16-icon { @@ -4289,13 +4549,13 @@ } %with-git-pull-request-icon { - @extend %with-icon, %git-pull-request-svg-prop; - background-image: var(--git-pull-request-svg); + @extend %with-icon, %git-pull-request-16-svg-prop; + background-image: var(--git-pull-request-16-svg); } %with-git-pull-request-mask { - @extend %with-mask, %git-pull-request-svg-prop; - -webkit-mask-image: var(--git-pull-request-svg); - mask-image: var(--git-pull-request-svg); + @extend %with-mask, %git-pull-request-16-svg-prop; + -webkit-mask-image: var(--git-pull-request-16-svg); + mask-image: var(--git-pull-request-16-svg); } %with-git-repo-16-icon { @@ -4319,13 +4579,13 @@ } %with-git-repository-icon { - @extend %with-icon, %git-repository-svg-prop; - background-image: var(--git-repository-svg); + @extend %with-icon, %git-repo-16-svg-prop; + background-image: var(--git-repo-16-svg); } %with-git-repository-mask { - @extend %with-mask, %git-repository-svg-prop; - -webkit-mask-image: var(--git-repository-svg); - mask-image: var(--git-repository-svg); + @extend %with-mask, %git-repo-16-svg-prop; + -webkit-mask-image: var(--git-repo-16-svg); + mask-image: var(--git-repo-16-svg); } %with-github-16-icon { @@ -4569,13 +4829,13 @@ } %with-guide-icon { - @extend %with-icon, %guide-svg-prop; - background-image: var(--guide-svg); + @extend %with-icon, %guide-16-svg-prop; + background-image: var(--guide-16-svg); } %with-guide-mask { - @extend %with-mask, %guide-svg-prop; - -webkit-mask-image: var(--guide-svg); - mask-image: var(--guide-svg); + @extend %with-mask, %guide-16-svg-prop; + -webkit-mask-image: var(--guide-16-svg); + mask-image: var(--guide-16-svg); } %with-hammer-16-icon { @@ -4598,6 +4858,26 @@ mask-image: var(--hammer-24-svg); } +%with-handshake-16-icon { + @extend %with-icon, %handshake-16-svg-prop; + background-image: var(--handshake-16-svg); +} +%with-handshake-16-mask { + @extend %with-mask, %handshake-16-svg-prop; + -webkit-mask-image: var(--handshake-16-svg); + mask-image: var(--handshake-16-svg); +} + +%with-handshake-24-icon { + @extend %with-icon, %handshake-24-svg-prop; + background-image: var(--handshake-24-svg); +} +%with-handshake-24-mask { + @extend %with-mask, %handshake-24-svg-prop; + -webkit-mask-image: var(--handshake-24-svg); + mask-image: var(--handshake-24-svg); +} + %with-hard-drive-16-icon { @extend %with-icon, %hard-drive-16-svg-prop; background-image: var(--hard-drive-16-svg); @@ -4638,6 +4918,86 @@ mask-image: var(--hash-24-svg); } +%with-hashicorp-16-icon { + @extend %with-icon, %hashicorp-16-svg-prop; + background-image: var(--hashicorp-16-svg); +} +%with-hashicorp-16-mask { + @extend %with-mask, %hashicorp-16-svg-prop; + -webkit-mask-image: var(--hashicorp-16-svg); + mask-image: var(--hashicorp-16-svg); +} + +%with-hashicorp-24-icon { + @extend %with-icon, %hashicorp-24-svg-prop; + background-image: var(--hashicorp-24-svg); +} +%with-hashicorp-24-mask { + @extend %with-mask, %hashicorp-24-svg-prop; + -webkit-mask-image: var(--hashicorp-24-svg); + mask-image: var(--hashicorp-24-svg); +} + +%with-hashicorp-color-16-icon { + @extend %with-icon, %hashicorp-color-16-svg-prop; + background-image: var(--hashicorp-color-16-svg); +} +%with-hashicorp-color-16-mask { + @extend %with-mask, %hashicorp-color-16-svg-prop; + -webkit-mask-image: var(--hashicorp-color-16-svg); + mask-image: var(--hashicorp-color-16-svg); +} + +%with-hashicorp-color-24-icon { + @extend %with-icon, %hashicorp-color-24-svg-prop; + background-image: var(--hashicorp-color-24-svg); +} +%with-hashicorp-color-24-mask { + @extend %with-mask, %hashicorp-color-24-svg-prop; + -webkit-mask-image: var(--hashicorp-color-24-svg); + mask-image: var(--hashicorp-color-24-svg); +} + +%with-hcp-16-icon { + @extend %with-icon, %hcp-16-svg-prop; + background-image: var(--hcp-16-svg); +} +%with-hcp-16-mask { + @extend %with-mask, %hcp-16-svg-prop; + -webkit-mask-image: var(--hcp-16-svg); + mask-image: var(--hcp-16-svg); +} + +%with-hcp-24-icon { + @extend %with-icon, %hcp-24-svg-prop; + background-image: var(--hcp-24-svg); +} +%with-hcp-24-mask { + @extend %with-mask, %hcp-24-svg-prop; + -webkit-mask-image: var(--hcp-24-svg); + mask-image: var(--hcp-24-svg); +} + +%with-hcp-color-16-icon { + @extend %with-icon, %hcp-color-16-svg-prop; + background-image: var(--hcp-color-16-svg); +} +%with-hcp-color-16-mask { + @extend %with-mask, %hcp-color-16-svg-prop; + -webkit-mask-image: var(--hcp-color-16-svg); + mask-image: var(--hcp-color-16-svg); +} + +%with-hcp-color-24-icon { + @extend %with-icon, %hcp-color-24-svg-prop; + background-image: var(--hcp-color-24-svg); +} +%with-hcp-color-24-mask { + @extend %with-mask, %hcp-color-24-svg-prop; + -webkit-mask-image: var(--hcp-color-24-svg); + mask-image: var(--hcp-color-24-svg); +} + %with-headphones-16-icon { @extend %with-icon, %headphones-16-svg-prop; background-image: var(--headphones-16-svg); @@ -4659,13 +5019,13 @@ } %with-health-icon { - @extend %with-icon, %health-svg-prop; - background-image: var(--health-svg); + @extend %with-icon, %activity-16-svg-prop; + background-image: var(--activity-16-svg); } %with-health-mask { - @extend %with-mask, %health-svg-prop; - -webkit-mask-image: var(--health-svg); - mask-image: var(--health-svg); + @extend %with-mask, %activity-16-svg-prop; + -webkit-mask-image: var(--activity-16-svg); + mask-image: var(--activity-16-svg); } %with-heart-16-icon { @@ -4749,23 +5109,23 @@ } %with-help-circle-fill-icon { - @extend %with-icon, %help-circle-fill-svg-prop; - background-image: var(--help-circle-fill-svg); + @extend %with-icon, %help-16-svg-prop; + background-image: var(--help-16-svg); } %with-help-circle-fill-mask { - @extend %with-mask, %help-circle-fill-svg-prop; - -webkit-mask-image: var(--help-circle-fill-svg); - mask-image: var(--help-circle-fill-svg); + @extend %with-mask, %help-16-svg-prop; + -webkit-mask-image: var(--help-16-svg); + mask-image: var(--help-16-svg); } %with-help-circle-outline-icon { - @extend %with-icon, %help-circle-outline-svg-prop; - background-image: var(--help-circle-outline-svg); + @extend %with-icon, %help-16-svg-prop; + background-image: var(--help-16-svg); } %with-help-circle-outline-mask { - @extend %with-mask, %help-circle-outline-svg-prop; - -webkit-mask-image: var(--help-circle-outline-svg); - mask-image: var(--help-circle-outline-svg); + @extend %with-mask, %help-16-svg-prop; + -webkit-mask-image: var(--help-16-svg); + mask-image: var(--help-16-svg); } %with-hexagon-16-icon { @@ -4829,13 +5189,13 @@ } %with-history-icon { - @extend %with-icon, %history-svg-prop; - background-image: var(--history-svg); + @extend %with-icon, %history-16-svg-prop; + background-image: var(--history-16-svg); } %with-history-mask { - @extend %with-mask, %history-svg-prop; - -webkit-mask-image: var(--history-svg); - mask-image: var(--history-svg); + @extend %with-mask, %history-16-svg-prop; + -webkit-mask-image: var(--history-16-svg); + mask-image: var(--history-16-svg); } %with-home-16-icon { @@ -4979,23 +5339,23 @@ } %with-info-circle-fill-icon { - @extend %with-icon, %info-circle-fill-svg-prop; - background-image: var(--info-circle-fill-svg); + @extend %with-icon, %info-16-svg-prop; + background-image: var(--info-16-svg); } %with-info-circle-fill-mask { - @extend %with-mask, %info-circle-fill-svg-prop; - -webkit-mask-image: var(--info-circle-fill-svg); - mask-image: var(--info-circle-fill-svg); + @extend %with-mask, %info-16-svg-prop; + -webkit-mask-image: var(--info-16-svg); + mask-image: var(--info-16-svg); } %with-info-circle-outline-icon { - @extend %with-icon, %info-circle-outline-svg-prop; - background-image: var(--info-circle-outline-svg); + @extend %with-icon, %info-16-svg-prop; + background-image: var(--info-16-svg); } %with-info-circle-outline-mask { - @extend %with-mask, %info-circle-outline-svg-prop; - -webkit-mask-image: var(--info-circle-outline-svg); - mask-image: var(--info-circle-outline-svg); + @extend %with-mask, %info-16-svg-prop; + -webkit-mask-image: var(--info-16-svg); + mask-image: var(--info-16-svg); } %with-jump-link-16-icon { @@ -5059,13 +5419,33 @@ } %with-key-icon { - @extend %with-icon, %key-svg-prop; - background-image: var(--key-svg); + @extend %with-icon, %key-16-svg-prop; + background-image: var(--key-16-svg); } %with-key-mask { - @extend %with-mask, %key-svg-prop; - -webkit-mask-image: var(--key-svg); - mask-image: var(--key-svg); + @extend %with-mask, %key-16-svg-prop; + -webkit-mask-image: var(--key-16-svg); + mask-image: var(--key-16-svg); +} + +%with-keychain-16-icon { + @extend %with-icon, %keychain-16-svg-prop; + background-image: var(--keychain-16-svg); +} +%with-keychain-16-mask { + @extend %with-mask, %keychain-16-svg-prop; + -webkit-mask-image: var(--keychain-16-svg); + mask-image: var(--keychain-16-svg); +} + +%with-keychain-24-icon { + @extend %with-icon, %keychain-24-svg-prop; + background-image: var(--keychain-24-svg); +} +%with-keychain-24-mask { + @extend %with-mask, %keychain-24-svg-prop; + -webkit-mask-image: var(--keychain-24-svg); + mask-image: var(--keychain-24-svg); } %with-kubernetes-16-icon { @@ -5149,13 +5529,13 @@ } %with-layers-icon { - @extend %with-icon, %layers-svg-prop; - background-image: var(--layers-svg); + @extend %with-icon, %layers-16-svg-prop; + background-image: var(--layers-16-svg); } %with-layers-mask { - @extend %with-mask, %layers-svg-prop; - -webkit-mask-image: var(--layers-svg); - mask-image: var(--layers-svg); + @extend %with-mask, %layers-16-svg-prop; + -webkit-mask-image: var(--layers-16-svg); + mask-image: var(--layers-16-svg); } %with-layout-16-icon { @@ -5219,13 +5599,13 @@ } %with-learn-icon { - @extend %with-icon, %learn-svg-prop; - background-image: var(--learn-svg); + @extend %with-icon, %learn-16-svg-prop; + background-image: var(--learn-16-svg); } %with-learn-mask { - @extend %with-mask, %learn-svg-prop; - -webkit-mask-image: var(--learn-svg); - mask-image: var(--learn-svg); + @extend %with-mask, %learn-16-svg-prop; + -webkit-mask-image: var(--learn-16-svg); + mask-image: var(--learn-16-svg); } %with-line-chart-16-icon { @@ -5289,13 +5669,53 @@ } %with-link-icon { - @extend %with-icon, %link-svg-prop; - background-image: var(--link-svg); + @extend %with-icon, %link-16-svg-prop; + background-image: var(--link-16-svg); } %with-link-mask { - @extend %with-mask, %link-svg-prop; - -webkit-mask-image: var(--link-svg); - mask-image: var(--link-svg); + @extend %with-mask, %link-16-svg-prop; + -webkit-mask-image: var(--link-16-svg); + mask-image: var(--link-16-svg); +} + +%with-linkedin-16-icon { + @extend %with-icon, %linkedin-16-svg-prop; + background-image: var(--linkedin-16-svg); +} +%with-linkedin-16-mask { + @extend %with-mask, %linkedin-16-svg-prop; + -webkit-mask-image: var(--linkedin-16-svg); + mask-image: var(--linkedin-16-svg); +} + +%with-linkedin-24-icon { + @extend %with-icon, %linkedin-24-svg-prop; + background-image: var(--linkedin-24-svg); +} +%with-linkedin-24-mask { + @extend %with-mask, %linkedin-24-svg-prop; + -webkit-mask-image: var(--linkedin-24-svg); + mask-image: var(--linkedin-24-svg); +} + +%with-linkedin-color-16-icon { + @extend %with-icon, %linkedin-color-16-svg-prop; + background-image: var(--linkedin-color-16-svg); +} +%with-linkedin-color-16-mask { + @extend %with-mask, %linkedin-color-16-svg-prop; + -webkit-mask-image: var(--linkedin-color-16-svg); + mask-image: var(--linkedin-color-16-svg); +} + +%with-linkedin-color-24-icon { + @extend %with-icon, %linkedin-color-24-svg-prop; + background-image: var(--linkedin-color-24-svg); +} +%with-linkedin-color-24-mask { + @extend %with-mask, %linkedin-color-24-svg-prop; + -webkit-mask-image: var(--linkedin-color-24-svg); + mask-image: var(--linkedin-color-24-svg); } %with-list-16-icon { @@ -5318,6 +5738,26 @@ mask-image: var(--list-24-svg); } +%with-load-balancer-16-icon { + @extend %with-icon, %load-balancer-16-svg-prop; + background-image: var(--load-balancer-16-svg); +} +%with-load-balancer-16-mask { + @extend %with-mask, %load-balancer-16-svg-prop; + -webkit-mask-image: var(--load-balancer-16-svg); + mask-image: var(--load-balancer-16-svg); +} + +%with-load-balancer-24-icon { + @extend %with-icon, %load-balancer-24-svg-prop; + background-image: var(--load-balancer-24-svg); +} +%with-load-balancer-24-mask { + @extend %with-mask, %load-balancer-24-svg-prop; + -webkit-mask-image: var(--load-balancer-24-svg); + mask-image: var(--load-balancer-24-svg); +} + %with-loading-icon { @extend %with-icon, %loading-svg-prop; background-image: var(--loading-svg); @@ -5349,43 +5789,43 @@ } %with-lock-closed-fill-icon { - @extend %with-icon, %lock-closed-fill-svg-prop; - background-image: var(--lock-closed-fill-svg); + @extend %with-icon, %lock-fill-16-svg-prop; + background-image: var(--lock-fill-16-svg); } %with-lock-closed-fill-mask { - @extend %with-mask, %lock-closed-fill-svg-prop; - -webkit-mask-image: var(--lock-closed-fill-svg); - mask-image: var(--lock-closed-fill-svg); + @extend %with-mask, %lock-fill-16-svg-prop; + -webkit-mask-image: var(--lock-fill-16-svg); + mask-image: var(--lock-fill-16-svg); } %with-lock-closed-outline-icon { - @extend %with-icon, %lock-closed-outline-svg-prop; - background-image: var(--lock-closed-outline-svg); + @extend %with-icon, %lock-16-svg-prop; + background-image: var(--lock-16-svg); } %with-lock-closed-outline-mask { - @extend %with-mask, %lock-closed-outline-svg-prop; - -webkit-mask-image: var(--lock-closed-outline-svg); - mask-image: var(--lock-closed-outline-svg); + @extend %with-mask, %lock-16-svg-prop; + -webkit-mask-image: var(--lock-16-svg); + mask-image: var(--lock-16-svg); } %with-lock-closed-icon { - @extend %with-icon, %lock-closed-svg-prop; - background-image: var(--lock-closed-svg); + @extend %with-icon, %lock-fill-16-svg-prop; + background-image: var(--lock-fill-16-svg); } %with-lock-closed-mask { - @extend %with-mask, %lock-closed-svg-prop; - -webkit-mask-image: var(--lock-closed-svg); - mask-image: var(--lock-closed-svg); + @extend %with-mask, %lock-fill-16-svg-prop; + -webkit-mask-image: var(--lock-fill-16-svg); + mask-image: var(--lock-fill-16-svg); } %with-lock-disabled-icon { - @extend %with-icon, %lock-disabled-svg-prop; - background-image: var(--lock-disabled-svg); + @extend %with-icon, %lock-off-16-svg-prop; + background-image: var(--lock-off-16-svg); } %with-lock-disabled-mask { - @extend %with-mask, %lock-disabled-svg-prop; - -webkit-mask-image: var(--lock-disabled-svg); - mask-image: var(--lock-disabled-svg); + @extend %with-mask, %lock-off-16-svg-prop; + -webkit-mask-image: var(--lock-off-16-svg); + mask-image: var(--lock-off-16-svg); } %with-lock-fill-16-icon { @@ -5429,133 +5869,133 @@ } %with-lock-open-icon { - @extend %with-icon, %lock-open-svg-prop; - background-image: var(--lock-open-svg); + @extend %with-icon, %unlock-16-svg-prop; + background-image: var(--unlock-16-svg); } %with-lock-open-mask { - @extend %with-mask, %lock-open-svg-prop; - -webkit-mask-image: var(--lock-open-svg); - mask-image: var(--lock-open-svg); + @extend %with-mask, %unlock-16-svg-prop; + -webkit-mask-image: var(--unlock-16-svg); + mask-image: var(--unlock-16-svg); } %with-logo-alicloud-color-icon { - @extend %with-icon, %logo-alicloud-color-svg-prop; - background-image: var(--logo-alicloud-color-svg); + @extend %with-icon, %alibaba-color-16-svg-prop; + background-image: var(--alibaba-color-16-svg); } %with-logo-alicloud-color-mask { - @extend %with-mask, %logo-alicloud-color-svg-prop; - -webkit-mask-image: var(--logo-alicloud-color-svg); - mask-image: var(--logo-alicloud-color-svg); + @extend %with-mask, %alibaba-color-16-svg-prop; + -webkit-mask-image: var(--alibaba-color-16-svg); + mask-image: var(--alibaba-color-16-svg); } %with-logo-alicloud-monochrome-icon { - @extend %with-icon, %logo-alicloud-monochrome-svg-prop; - background-image: var(--logo-alicloud-monochrome-svg); + @extend %with-icon, %alibaba-16-svg-prop; + background-image: var(--alibaba-16-svg); } %with-logo-alicloud-monochrome-mask { - @extend %with-mask, %logo-alicloud-monochrome-svg-prop; - -webkit-mask-image: var(--logo-alicloud-monochrome-svg); - mask-image: var(--logo-alicloud-monochrome-svg); + @extend %with-mask, %alibaba-16-svg-prop; + -webkit-mask-image: var(--alibaba-16-svg); + mask-image: var(--alibaba-16-svg); } %with-logo-auth0-color-icon { - @extend %with-icon, %logo-auth0-color-svg-prop; - background-image: var(--logo-auth0-color-svg); + @extend %with-icon, %auth0-color-16-svg-prop; + background-image: var(--auth0-color-16-svg); } %with-logo-auth0-color-mask { - @extend %with-mask, %logo-auth0-color-svg-prop; - -webkit-mask-image: var(--logo-auth0-color-svg); - mask-image: var(--logo-auth0-color-svg); + @extend %with-mask, %auth0-color-16-svg-prop; + -webkit-mask-image: var(--auth0-color-16-svg); + mask-image: var(--auth0-color-16-svg); } %with-logo-aws-color-icon { - @extend %with-icon, %logo-aws-color-svg-prop; - background-image: var(--logo-aws-color-svg); + @extend %with-icon, %aws-color-16-svg-prop; + background-image: var(--aws-color-16-svg); } %with-logo-aws-color-mask { - @extend %with-mask, %logo-aws-color-svg-prop; - -webkit-mask-image: var(--logo-aws-color-svg); - mask-image: var(--logo-aws-color-svg); + @extend %with-mask, %aws-color-16-svg-prop; + -webkit-mask-image: var(--aws-color-16-svg); + mask-image: var(--aws-color-16-svg); } %with-logo-aws-monochrome-icon { - @extend %with-icon, %logo-aws-monochrome-svg-prop; - background-image: var(--logo-aws-monochrome-svg); + @extend %with-icon, %aws-16-svg-prop; + background-image: var(--aws-16-svg); } %with-logo-aws-monochrome-mask { - @extend %with-mask, %logo-aws-monochrome-svg-prop; - -webkit-mask-image: var(--logo-aws-monochrome-svg); - mask-image: var(--logo-aws-monochrome-svg); + @extend %with-mask, %aws-16-svg-prop; + -webkit-mask-image: var(--aws-16-svg); + mask-image: var(--aws-16-svg); } %with-logo-azure-color-icon { - @extend %with-icon, %logo-azure-color-svg-prop; - background-image: var(--logo-azure-color-svg); + @extend %with-icon, %azure-color-16-svg-prop; + background-image: var(--azure-color-16-svg); } %with-logo-azure-color-mask { - @extend %with-mask, %logo-azure-color-svg-prop; - -webkit-mask-image: var(--logo-azure-color-svg); - mask-image: var(--logo-azure-color-svg); + @extend %with-mask, %azure-color-16-svg-prop; + -webkit-mask-image: var(--azure-color-16-svg); + mask-image: var(--azure-color-16-svg); } %with-logo-azure-dev-ops-color-icon { - @extend %with-icon, %logo-azure-dev-ops-color-svg-prop; - background-image: var(--logo-azure-dev-ops-color-svg); + @extend %with-icon, %azure-devops-color-16-svg-prop; + background-image: var(--azure-devops-color-16-svg); } %with-logo-azure-dev-ops-color-mask { - @extend %with-mask, %logo-azure-dev-ops-color-svg-prop; - -webkit-mask-image: var(--logo-azure-dev-ops-color-svg); - mask-image: var(--logo-azure-dev-ops-color-svg); + @extend %with-mask, %azure-devops-color-16-svg-prop; + -webkit-mask-image: var(--azure-devops-color-16-svg); + mask-image: var(--azure-devops-color-16-svg); } %with-logo-azure-dev-ops-monochrome-icon { - @extend %with-icon, %logo-azure-dev-ops-monochrome-svg-prop; - background-image: var(--logo-azure-dev-ops-monochrome-svg); + @extend %with-icon, %azure-devops-16-svg-prop; + background-image: var(--azure-devops-16-svg); } %with-logo-azure-dev-ops-monochrome-mask { - @extend %with-mask, %logo-azure-dev-ops-monochrome-svg-prop; - -webkit-mask-image: var(--logo-azure-dev-ops-monochrome-svg); - mask-image: var(--logo-azure-dev-ops-monochrome-svg); + @extend %with-mask, %azure-devops-16-svg-prop; + -webkit-mask-image: var(--azure-devops-16-svg); + mask-image: var(--azure-devops-16-svg); } %with-logo-azure-monochrome-icon { - @extend %with-icon, %logo-azure-monochrome-svg-prop; - background-image: var(--logo-azure-monochrome-svg); + @extend %with-icon, %azure-16-svg-prop; + background-image: var(--azure-16-svg); } %with-logo-azure-monochrome-mask { - @extend %with-mask, %logo-azure-monochrome-svg-prop; - -webkit-mask-image: var(--logo-azure-monochrome-svg); - mask-image: var(--logo-azure-monochrome-svg); + @extend %with-mask, %azure-16-svg-prop; + -webkit-mask-image: var(--azure-16-svg); + mask-image: var(--azure-16-svg); } %with-logo-bitbucket-color-icon { - @extend %with-icon, %logo-bitbucket-color-svg-prop; - background-image: var(--logo-bitbucket-color-svg); + @extend %with-icon, %bitbucket-color-16-svg-prop; + background-image: var(--bitbucket-color-16-svg); } %with-logo-bitbucket-color-mask { - @extend %with-mask, %logo-bitbucket-color-svg-prop; - -webkit-mask-image: var(--logo-bitbucket-color-svg); - mask-image: var(--logo-bitbucket-color-svg); + @extend %with-mask, %bitbucket-color-16-svg-prop; + -webkit-mask-image: var(--bitbucket-color-16-svg); + mask-image: var(--bitbucket-color-16-svg); } %with-logo-bitbucket-monochrome-icon { - @extend %with-icon, %logo-bitbucket-monochrome-svg-prop; - background-image: var(--logo-bitbucket-monochrome-svg); + @extend %with-icon, %bitbucket-16-svg-prop; + background-image: var(--bitbucket-16-svg); } %with-logo-bitbucket-monochrome-mask { - @extend %with-mask, %logo-bitbucket-monochrome-svg-prop; - -webkit-mask-image: var(--logo-bitbucket-monochrome-svg); - mask-image: var(--logo-bitbucket-monochrome-svg); + @extend %with-mask, %bitbucket-16-svg-prop; + -webkit-mask-image: var(--bitbucket-16-svg); + mask-image: var(--bitbucket-16-svg); } %with-logo-consul-color-icon { - @extend %with-icon, %logo-consul-color-svg-prop; - background-image: var(--logo-consul-color-svg); + @extend %with-icon, %consul-color-16-svg-prop; + background-image: var(--consul-color-16-svg); } %with-logo-consul-color-mask { - @extend %with-mask, %logo-consul-color-svg-prop; - -webkit-mask-image: var(--logo-consul-color-svg); - mask-image: var(--logo-consul-color-svg); + @extend %with-mask, %consul-color-16-svg-prop; + -webkit-mask-image: var(--consul-color-16-svg); + mask-image: var(--consul-color-16-svg); } %with-logo-ember-circle-color-icon { @@ -5569,63 +6009,63 @@ } %with-logo-gcp-color-icon { - @extend %with-icon, %logo-gcp-color-svg-prop; - background-image: var(--logo-gcp-color-svg); + @extend %with-icon, %gcp-color-16-svg-prop; + background-image: var(--gcp-color-16-svg); } %with-logo-gcp-color-mask { - @extend %with-mask, %logo-gcp-color-svg-prop; - -webkit-mask-image: var(--logo-gcp-color-svg); - mask-image: var(--logo-gcp-color-svg); + @extend %with-mask, %gcp-color-16-svg-prop; + -webkit-mask-image: var(--gcp-color-16-svg); + mask-image: var(--gcp-color-16-svg); } %with-logo-gcp-monochrome-icon { - @extend %with-icon, %logo-gcp-monochrome-svg-prop; - background-image: var(--logo-gcp-monochrome-svg); + @extend %with-icon, %gcp-16-svg-prop; + background-image: var(--gcp-16-svg); } %with-logo-gcp-monochrome-mask { - @extend %with-mask, %logo-gcp-monochrome-svg-prop; - -webkit-mask-image: var(--logo-gcp-monochrome-svg); - mask-image: var(--logo-gcp-monochrome-svg); + @extend %with-mask, %gcp-16-svg-prop; + -webkit-mask-image: var(--gcp-16-svg); + mask-image: var(--gcp-16-svg); } %with-logo-github-color-icon { - @extend %with-icon, %logo-github-color-svg-prop; - background-image: var(--logo-github-color-svg); + @extend %with-icon, %github-color-16-svg-prop; + background-image: var(--github-color-16-svg); } %with-logo-github-color-mask { - @extend %with-mask, %logo-github-color-svg-prop; - -webkit-mask-image: var(--logo-github-color-svg); - mask-image: var(--logo-github-color-svg); + @extend %with-mask, %github-color-16-svg-prop; + -webkit-mask-image: var(--github-color-16-svg); + mask-image: var(--github-color-16-svg); } %with-logo-github-monochrome-icon { - @extend %with-icon, %logo-github-monochrome-svg-prop; - background-image: var(--logo-github-monochrome-svg); + @extend %with-icon, %github-16-svg-prop; + background-image: var(--github-16-svg); } %with-logo-github-monochrome-mask { - @extend %with-mask, %logo-github-monochrome-svg-prop; - -webkit-mask-image: var(--logo-github-monochrome-svg); - mask-image: var(--logo-github-monochrome-svg); + @extend %with-mask, %github-16-svg-prop; + -webkit-mask-image: var(--github-16-svg); + mask-image: var(--github-16-svg); } %with-logo-gitlab-color-icon { - @extend %with-icon, %logo-gitlab-color-svg-prop; - background-image: var(--logo-gitlab-color-svg); + @extend %with-icon, %gitlab-color-16-svg-prop; + background-image: var(--gitlab-color-16-svg); } %with-logo-gitlab-color-mask { - @extend %with-mask, %logo-gitlab-color-svg-prop; - -webkit-mask-image: var(--logo-gitlab-color-svg); - mask-image: var(--logo-gitlab-color-svg); + @extend %with-mask, %gitlab-color-16-svg-prop; + -webkit-mask-image: var(--gitlab-color-16-svg); + mask-image: var(--gitlab-color-16-svg); } %with-logo-gitlab-monochrome-icon { - @extend %with-icon, %logo-gitlab-monochrome-svg-prop; - background-image: var(--logo-gitlab-monochrome-svg); + @extend %with-icon, %gitlab-16-svg-prop; + background-image: var(--gitlab-16-svg); } %with-logo-gitlab-monochrome-mask { - @extend %with-mask, %logo-gitlab-monochrome-svg-prop; - -webkit-mask-image: var(--logo-gitlab-monochrome-svg); - mask-image: var(--logo-gitlab-monochrome-svg); + @extend %with-mask, %gitlab-16-svg-prop; + -webkit-mask-image: var(--gitlab-16-svg); + mask-image: var(--gitlab-16-svg); } %with-logo-glimmer-color-icon { @@ -5639,23 +6079,23 @@ } %with-logo-google-color-icon { - @extend %with-icon, %logo-google-color-svg-prop; - background-image: var(--logo-google-color-svg); + @extend %with-icon, %google-color-16-svg-prop; + background-image: var(--google-color-16-svg); } %with-logo-google-color-mask { - @extend %with-mask, %logo-google-color-svg-prop; - -webkit-mask-image: var(--logo-google-color-svg); - mask-image: var(--logo-google-color-svg); + @extend %with-mask, %google-color-16-svg-prop; + -webkit-mask-image: var(--google-color-16-svg); + mask-image: var(--google-color-16-svg); } %with-logo-google-monochrome-icon { - @extend %with-icon, %logo-google-monochrome-svg-prop; - background-image: var(--logo-google-monochrome-svg); + @extend %with-icon, %google-16-svg-prop; + background-image: var(--google-16-svg); } %with-logo-google-monochrome-mask { - @extend %with-mask, %logo-google-monochrome-svg-prop; - -webkit-mask-image: var(--logo-google-monochrome-svg); - mask-image: var(--logo-google-monochrome-svg); + @extend %with-mask, %google-16-svg-prop; + -webkit-mask-image: var(--google-16-svg); + mask-image: var(--google-16-svg); } %with-logo-hashicorp-color-icon { @@ -5679,43 +6119,43 @@ } %with-logo-kubernetes-color-icon { - @extend %with-icon, %logo-kubernetes-color-svg-prop; - background-image: var(--logo-kubernetes-color-svg); + @extend %with-icon, %kubernetes-color-16-svg-prop; + background-image: var(--kubernetes-color-16-svg); } %with-logo-kubernetes-color-mask { - @extend %with-mask, %logo-kubernetes-color-svg-prop; - -webkit-mask-image: var(--logo-kubernetes-color-svg); - mask-image: var(--logo-kubernetes-color-svg); + @extend %with-mask, %kubernetes-color-16-svg-prop; + -webkit-mask-image: var(--kubernetes-color-16-svg); + mask-image: var(--kubernetes-color-16-svg); } %with-logo-kubernetes-monochrome-icon { - @extend %with-icon, %logo-kubernetes-monochrome-svg-prop; - background-image: var(--logo-kubernetes-monochrome-svg); + @extend %with-icon, %kubernetes-16-svg-prop; + background-image: var(--kubernetes-16-svg); } %with-logo-kubernetes-monochrome-mask { - @extend %with-mask, %logo-kubernetes-monochrome-svg-prop; - -webkit-mask-image: var(--logo-kubernetes-monochrome-svg); - mask-image: var(--logo-kubernetes-monochrome-svg); + @extend %with-mask, %kubernetes-16-svg-prop; + -webkit-mask-image: var(--kubernetes-16-svg); + mask-image: var(--kubernetes-16-svg); } %with-logo-microsoft-color-icon { - @extend %with-icon, %logo-microsoft-color-svg-prop; - background-image: var(--logo-microsoft-color-svg); + @extend %with-icon, %microsoft-color-16-svg-prop; + background-image: var(--microsoft-color-16-svg); } %with-logo-microsoft-color-mask { - @extend %with-mask, %logo-microsoft-color-svg-prop; - -webkit-mask-image: var(--logo-microsoft-color-svg); - mask-image: var(--logo-microsoft-color-svg); + @extend %with-mask, %microsoft-color-16-svg-prop; + -webkit-mask-image: var(--microsoft-color-16-svg); + mask-image: var(--microsoft-color-16-svg); } %with-logo-nomad-color-icon { - @extend %with-icon, %logo-nomad-color-svg-prop; - background-image: var(--logo-nomad-color-svg); + @extend %with-icon, %nomad-color-16-svg-prop; + background-image: var(--nomad-color-16-svg); } %with-logo-nomad-color-mask { - @extend %with-mask, %logo-nomad-color-svg-prop; - -webkit-mask-image: var(--logo-nomad-color-svg); - mask-image: var(--logo-nomad-color-svg); + @extend %with-mask, %nomad-color-16-svg-prop; + -webkit-mask-image: var(--nomad-color-16-svg); + mask-image: var(--nomad-color-16-svg); } %with-logo-oidc-color-icon { @@ -5729,63 +6169,63 @@ } %with-logo-okta-color-icon { - @extend %with-icon, %logo-okta-color-svg-prop; - background-image: var(--logo-okta-color-svg); + @extend %with-icon, %okta-color-16-svg-prop; + background-image: var(--okta-color-16-svg); } %with-logo-okta-color-mask { - @extend %with-mask, %logo-okta-color-svg-prop; - -webkit-mask-image: var(--logo-okta-color-svg); - mask-image: var(--logo-okta-color-svg); + @extend %with-mask, %okta-color-16-svg-prop; + -webkit-mask-image: var(--okta-color-16-svg); + mask-image: var(--okta-color-16-svg); } %with-logo-oracle-color-icon { - @extend %with-icon, %logo-oracle-color-svg-prop; - background-image: var(--logo-oracle-color-svg); + @extend %with-icon, %oracle-color-16-svg-prop; + background-image: var(--oracle-color-16-svg); } %with-logo-oracle-color-mask { - @extend %with-mask, %logo-oracle-color-svg-prop; - -webkit-mask-image: var(--logo-oracle-color-svg); - mask-image: var(--logo-oracle-color-svg); + @extend %with-mask, %oracle-color-16-svg-prop; + -webkit-mask-image: var(--oracle-color-16-svg); + mask-image: var(--oracle-color-16-svg); } %with-logo-oracle-monochrome-icon { - @extend %with-icon, %logo-oracle-monochrome-svg-prop; - background-image: var(--logo-oracle-monochrome-svg); + @extend %with-icon, %oracle-16-svg-prop; + background-image: var(--oracle-16-svg); } %with-logo-oracle-monochrome-mask { - @extend %with-mask, %logo-oracle-monochrome-svg-prop; - -webkit-mask-image: var(--logo-oracle-monochrome-svg); - mask-image: var(--logo-oracle-monochrome-svg); + @extend %with-mask, %oracle-16-svg-prop; + -webkit-mask-image: var(--oracle-16-svg); + mask-image: var(--oracle-16-svg); } %with-logo-slack-color-icon { - @extend %with-icon, %logo-slack-color-svg-prop; - background-image: var(--logo-slack-color-svg); + @extend %with-icon, %slack-color-16-svg-prop; + background-image: var(--slack-color-16-svg); } %with-logo-slack-color-mask { - @extend %with-mask, %logo-slack-color-svg-prop; - -webkit-mask-image: var(--logo-slack-color-svg); - mask-image: var(--logo-slack-color-svg); + @extend %with-mask, %slack-color-16-svg-prop; + -webkit-mask-image: var(--slack-color-16-svg); + mask-image: var(--slack-color-16-svg); } %with-logo-slack-monochrome-icon { - @extend %with-icon, %logo-slack-monochrome-svg-prop; - background-image: var(--logo-slack-monochrome-svg); + @extend %with-icon, %slack-16-svg-prop; + background-image: var(--slack-16-svg); } %with-logo-slack-monochrome-mask { - @extend %with-mask, %logo-slack-monochrome-svg-prop; - -webkit-mask-image: var(--logo-slack-monochrome-svg); - mask-image: var(--logo-slack-monochrome-svg); + @extend %with-mask, %slack-16-svg-prop; + -webkit-mask-image: var(--slack-16-svg); + mask-image: var(--slack-16-svg); } %with-logo-terraform-color-icon { - @extend %with-icon, %logo-terraform-color-svg-prop; - background-image: var(--logo-terraform-color-svg); + @extend %with-icon, %terraform-color-16-svg-prop; + background-image: var(--terraform-color-16-svg); } %with-logo-terraform-color-mask { - @extend %with-mask, %logo-terraform-color-svg-prop; - -webkit-mask-image: var(--logo-terraform-color-svg); - mask-image: var(--logo-terraform-color-svg); + @extend %with-mask, %terraform-color-16-svg-prop; + -webkit-mask-image: var(--terraform-color-16-svg); + mask-image: var(--terraform-color-16-svg); } %with-logo-vault-color-icon { @@ -5799,23 +6239,23 @@ } %with-logo-vmware-color-icon { - @extend %with-icon, %logo-vmware-color-svg-prop; - background-image: var(--logo-vmware-color-svg); + @extend %with-icon, %vmware-color-16-svg-prop; + background-image: var(--vmware-color-16-svg); } %with-logo-vmware-color-mask { - @extend %with-mask, %logo-vmware-color-svg-prop; - -webkit-mask-image: var(--logo-vmware-color-svg); - mask-image: var(--logo-vmware-color-svg); + @extend %with-mask, %vmware-color-16-svg-prop; + -webkit-mask-image: var(--vmware-color-16-svg); + mask-image: var(--vmware-color-16-svg); } %with-logo-vmware-monochrome-icon { - @extend %with-icon, %logo-vmware-monochrome-svg-prop; - background-image: var(--logo-vmware-monochrome-svg); + @extend %with-icon, %vmware-16-svg-prop; + background-image: var(--vmware-16-svg); } %with-logo-vmware-monochrome-mask { - @extend %with-mask, %logo-vmware-monochrome-svg-prop; - -webkit-mask-image: var(--logo-vmware-monochrome-svg); - mask-image: var(--logo-vmware-monochrome-svg); + @extend %with-mask, %vmware-16-svg-prop; + -webkit-mask-image: var(--vmware-16-svg); + mask-image: var(--vmware-16-svg); } %with-mail-16-icon { @@ -5858,6 +6298,26 @@ mask-image: var(--mail-open-24-svg); } +%with-mainframe-16-icon { + @extend %with-icon, %mainframe-16-svg-prop; + background-image: var(--mainframe-16-svg); +} +%with-mainframe-16-mask { + @extend %with-mask, %mainframe-16-svg-prop; + -webkit-mask-image: var(--mainframe-16-svg); + mask-image: var(--mainframe-16-svg); +} + +%with-mainframe-24-icon { + @extend %with-icon, %mainframe-24-svg-prop; + background-image: var(--mainframe-24-svg); +} +%with-mainframe-24-mask { + @extend %with-mask, %mainframe-24-svg-prop; + -webkit-mask-image: var(--mainframe-24-svg); + mask-image: var(--mainframe-24-svg); +} + %with-map-16-icon { @extend %with-icon, %map-16-svg-prop; background-image: var(--map-16-svg); @@ -5979,13 +6439,13 @@ } %with-menu-icon { - @extend %with-icon, %menu-svg-prop; - background-image: var(--menu-svg); + @extend %with-icon, %menu-16-svg-prop; + background-image: var(--menu-16-svg); } %with-menu-mask { - @extend %with-mask, %menu-svg-prop; - -webkit-mask-image: var(--menu-svg); - mask-image: var(--menu-svg); + @extend %with-mask, %menu-16-svg-prop; + -webkit-mask-image: var(--menu-16-svg); + mask-image: var(--menu-16-svg); } %with-mesh-16-icon { @@ -6009,13 +6469,13 @@ } %with-mesh-icon { - @extend %with-icon, %mesh-svg-prop; - background-image: var(--mesh-svg); + @extend %with-icon, %mesh-16-svg-prop; + background-image: var(--mesh-16-svg); } %with-mesh-mask { - @extend %with-mask, %mesh-svg-prop; - -webkit-mask-image: var(--mesh-svg); - mask-image: var(--mesh-svg); + @extend %with-mask, %mesh-16-svg-prop; + -webkit-mask-image: var(--mesh-16-svg); + mask-image: var(--mesh-16-svg); } %with-message-circle-16-icon { @@ -6099,13 +6559,13 @@ } %with-message-icon { - @extend %with-icon, %message-svg-prop; - background-image: var(--message-svg); + @extend %with-icon, %message-square-fill-16-svg-prop; + background-image: var(--message-square-fill-16-svg); } %with-message-mask { - @extend %with-mask, %message-svg-prop; - -webkit-mask-image: var(--message-svg); - mask-image: var(--message-svg); + @extend %with-mask, %message-square-fill-16-svg-prop; + -webkit-mask-image: var(--message-square-fill-16-svg); + mask-image: var(--message-square-fill-16-svg); } %with-mic-16-icon { @@ -6289,33 +6749,33 @@ } %with-minus-circle-fill-icon { - @extend %with-icon, %minus-circle-fill-svg-prop; - background-image: var(--minus-circle-fill-svg); + @extend %with-icon, %minus-circle-16-svg-prop; + background-image: var(--minus-circle-16-svg); } %with-minus-circle-fill-mask { - @extend %with-mask, %minus-circle-fill-svg-prop; - -webkit-mask-image: var(--minus-circle-fill-svg); - mask-image: var(--minus-circle-fill-svg); + @extend %with-mask, %minus-circle-16-svg-prop; + -webkit-mask-image: var(--minus-circle-16-svg); + mask-image: var(--minus-circle-16-svg); } %with-minus-circle-outline-icon { - @extend %with-icon, %minus-circle-outline-svg-prop; - background-image: var(--minus-circle-outline-svg); + @extend %with-icon, %minus-circle-16-svg-prop; + background-image: var(--minus-circle-16-svg); } %with-minus-circle-outline-mask { - @extend %with-mask, %minus-circle-outline-svg-prop; - -webkit-mask-image: var(--minus-circle-outline-svg); - mask-image: var(--minus-circle-outline-svg); + @extend %with-mask, %minus-circle-16-svg-prop; + -webkit-mask-image: var(--minus-circle-16-svg); + mask-image: var(--minus-circle-16-svg); } %with-minus-plain-icon { - @extend %with-icon, %minus-plain-svg-prop; - background-image: var(--minus-plain-svg); + @extend %with-icon, %minus-16-svg-prop; + background-image: var(--minus-16-svg); } %with-minus-plain-mask { - @extend %with-mask, %minus-plain-svg-prop; - -webkit-mask-image: var(--minus-plain-svg); - mask-image: var(--minus-plain-svg); + @extend %with-mask, %minus-16-svg-prop; + -webkit-mask-image: var(--minus-16-svg); + mask-image: var(--minus-16-svg); } %with-minus-plus-16-icon { @@ -6399,13 +6859,13 @@ } %with-minus-square-fill-icon { - @extend %with-icon, %minus-square-fill-svg-prop; - background-image: var(--minus-square-fill-svg); + @extend %with-icon, %minus-square-16-svg-prop; + background-image: var(--minus-square-16-svg); } %with-minus-square-fill-mask { - @extend %with-mask, %minus-square-fill-svg-prop; - -webkit-mask-image: var(--minus-square-fill-svg); - mask-image: var(--minus-square-fill-svg); + @extend %with-mask, %minus-square-16-svg-prop; + -webkit-mask-image: var(--minus-square-16-svg); + mask-image: var(--minus-square-16-svg); } %with-module-16-icon { @@ -6429,13 +6889,13 @@ } %with-module-icon { - @extend %with-icon, %module-svg-prop; - background-image: var(--module-svg); + @extend %with-icon, %module-16-svg-prop; + background-image: var(--module-16-svg); } %with-module-mask { - @extend %with-mask, %module-svg-prop; - -webkit-mask-image: var(--module-svg); - mask-image: var(--module-svg); + @extend %with-mask, %module-16-svg-prop; + -webkit-mask-image: var(--module-16-svg); + mask-image: var(--module-16-svg); } %with-monitor-16-icon { @@ -6499,13 +6959,13 @@ } %with-more-horizontal-icon { - @extend %with-icon, %more-horizontal-svg-prop; - background-image: var(--more-horizontal-svg); + @extend %with-icon, %more-horizontal-16-svg-prop; + background-image: var(--more-horizontal-16-svg); } %with-more-horizontal-mask { - @extend %with-mask, %more-horizontal-svg-prop; - -webkit-mask-image: var(--more-horizontal-svg); - mask-image: var(--more-horizontal-svg); + @extend %with-mask, %more-horizontal-16-svg-prop; + -webkit-mask-image: var(--more-horizontal-16-svg); + mask-image: var(--more-horizontal-16-svg); } %with-more-vertical-16-icon { @@ -6529,13 +6989,13 @@ } %with-more-vertical-icon { - @extend %with-icon, %more-vertical-svg-prop; - background-image: var(--more-vertical-svg); + @extend %with-icon, %more-vertical-16-svg-prop; + background-image: var(--more-vertical-16-svg); } %with-more-vertical-mask { - @extend %with-mask, %more-vertical-svg-prop; - -webkit-mask-image: var(--more-vertical-svg); - mask-image: var(--more-vertical-svg); + @extend %with-mask, %more-vertical-16-svg-prop; + -webkit-mask-image: var(--more-vertical-16-svg); + mask-image: var(--more-vertical-16-svg); } %with-mouse-pointer-16-icon { @@ -6718,34 +7178,74 @@ mask-image: var(--node-24-svg); } +%with-nomad-16-icon { + @extend %with-icon, %nomad-16-svg-prop; + background-image: var(--nomad-16-svg); +} +%with-nomad-16-mask { + @extend %with-mask, %nomad-16-svg-prop; + -webkit-mask-image: var(--nomad-16-svg); + mask-image: var(--nomad-16-svg); +} + +%with-nomad-24-icon { + @extend %with-icon, %nomad-24-svg-prop; + background-image: var(--nomad-24-svg); +} +%with-nomad-24-mask { + @extend %with-mask, %nomad-24-svg-prop; + -webkit-mask-image: var(--nomad-24-svg); + mask-image: var(--nomad-24-svg); +} + +%with-nomad-color-16-icon { + @extend %with-icon, %nomad-color-16-svg-prop; + background-image: var(--nomad-color-16-svg); +} +%with-nomad-color-16-mask { + @extend %with-mask, %nomad-color-16-svg-prop; + -webkit-mask-image: var(--nomad-color-16-svg); + mask-image: var(--nomad-color-16-svg); +} + +%with-nomad-color-24-icon { + @extend %with-icon, %nomad-color-24-svg-prop; + background-image: var(--nomad-color-24-svg); +} +%with-nomad-color-24-mask { + @extend %with-mask, %nomad-color-24-svg-prop; + -webkit-mask-image: var(--nomad-color-24-svg); + mask-image: var(--nomad-color-24-svg); +} + %with-notification-disabled-icon { - @extend %with-icon, %notification-disabled-svg-prop; - background-image: var(--notification-disabled-svg); + @extend %with-icon, %bell-off-16-svg-prop; + background-image: var(--bell-off-16-svg); } %with-notification-disabled-mask { - @extend %with-mask, %notification-disabled-svg-prop; - -webkit-mask-image: var(--notification-disabled-svg); - mask-image: var(--notification-disabled-svg); + @extend %with-mask, %bell-off-16-svg-prop; + -webkit-mask-image: var(--bell-off-16-svg); + mask-image: var(--bell-off-16-svg); } %with-notification-fill-icon { - @extend %with-icon, %notification-fill-svg-prop; - background-image: var(--notification-fill-svg); + @extend %with-icon, %bell-active-fill-16-svg-prop; + background-image: var(--bell-active-fill-16-svg); } %with-notification-fill-mask { - @extend %with-mask, %notification-fill-svg-prop; - -webkit-mask-image: var(--notification-fill-svg); - mask-image: var(--notification-fill-svg); + @extend %with-mask, %bell-active-fill-16-svg-prop; + -webkit-mask-image: var(--bell-active-fill-16-svg); + mask-image: var(--bell-active-fill-16-svg); } %with-notification-outline-icon { - @extend %with-icon, %notification-outline-svg-prop; - background-image: var(--notification-outline-svg); + @extend %with-icon, %bell-16-svg-prop; + background-image: var(--bell-16-svg); } %with-notification-outline-mask { - @extend %with-mask, %notification-outline-svg-prop; - -webkit-mask-image: var(--notification-outline-svg); - mask-image: var(--notification-outline-svg); + @extend %with-mask, %bell-16-svg-prop; + -webkit-mask-image: var(--bell-16-svg); + mask-image: var(--bell-16-svg); } %with-octagon-16-icon { @@ -6889,13 +7389,53 @@ } %with-outline-icon { - @extend %with-icon, %outline-svg-prop; - background-image: var(--outline-svg); + @extend %with-icon, %outline-16-svg-prop; + background-image: var(--outline-16-svg); } %with-outline-mask { - @extend %with-mask, %outline-svg-prop; - -webkit-mask-image: var(--outline-svg); - mask-image: var(--outline-svg); + @extend %with-mask, %outline-16-svg-prop; + -webkit-mask-image: var(--outline-16-svg); + mask-image: var(--outline-16-svg); +} + +%with-pack-16-icon { + @extend %with-icon, %pack-16-svg-prop; + background-image: var(--pack-16-svg); +} +%with-pack-16-mask { + @extend %with-mask, %pack-16-svg-prop; + -webkit-mask-image: var(--pack-16-svg); + mask-image: var(--pack-16-svg); +} + +%with-pack-24-icon { + @extend %with-icon, %pack-24-svg-prop; + background-image: var(--pack-24-svg); +} +%with-pack-24-mask { + @extend %with-mask, %pack-24-svg-prop; + -webkit-mask-image: var(--pack-24-svg); + mask-image: var(--pack-24-svg); +} + +%with-pack-color-16-icon { + @extend %with-icon, %pack-color-16-svg-prop; + background-image: var(--pack-color-16-svg); +} +%with-pack-color-16-mask { + @extend %with-mask, %pack-color-16-svg-prop; + -webkit-mask-image: var(--pack-color-16-svg); + mask-image: var(--pack-color-16-svg); +} + +%with-pack-color-24-icon { + @extend %with-icon, %pack-color-24-svg-prop; + background-image: var(--pack-color-24-svg); +} +%with-pack-color-24-mask { + @extend %with-mask, %pack-color-24-svg-prop; + -webkit-mask-image: var(--pack-color-24-svg); + mask-image: var(--pack-color-24-svg); } %with-package-16-icon { @@ -6918,14 +7458,54 @@ mask-image: var(--package-24-svg); } +%with-packer-16-icon { + @extend %with-icon, %packer-16-svg-prop; + background-image: var(--packer-16-svg); +} +%with-packer-16-mask { + @extend %with-mask, %packer-16-svg-prop; + -webkit-mask-image: var(--packer-16-svg); + mask-image: var(--packer-16-svg); +} + +%with-packer-24-icon { + @extend %with-icon, %packer-24-svg-prop; + background-image: var(--packer-24-svg); +} +%with-packer-24-mask { + @extend %with-mask, %packer-24-svg-prop; + -webkit-mask-image: var(--packer-24-svg); + mask-image: var(--packer-24-svg); +} + +%with-packer-color-16-icon { + @extend %with-icon, %packer-color-16-svg-prop; + background-image: var(--packer-color-16-svg); +} +%with-packer-color-16-mask { + @extend %with-mask, %packer-color-16-svg-prop; + -webkit-mask-image: var(--packer-color-16-svg); + mask-image: var(--packer-color-16-svg); +} + +%with-packer-color-24-icon { + @extend %with-icon, %packer-color-24-svg-prop; + background-image: var(--packer-color-24-svg); +} +%with-packer-color-24-mask { + @extend %with-mask, %packer-color-24-svg-prop; + -webkit-mask-image: var(--packer-color-24-svg); + mask-image: var(--packer-color-24-svg); +} + %with-page-outline-icon { - @extend %with-icon, %page-outline-svg-prop; - background-image: var(--page-outline-svg); + @extend %with-icon, %outline-16-svg-prop; + background-image: var(--outline-16-svg); } %with-page-outline-mask { - @extend %with-mask, %page-outline-svg-prop; - -webkit-mask-image: var(--page-outline-svg); - mask-image: var(--page-outline-svg); + @extend %with-mask, %outline-16-svg-prop; + -webkit-mask-image: var(--outline-16-svg); + mask-image: var(--outline-16-svg); } %with-paperclip-16-icon { @@ -6949,13 +7529,13 @@ } %with-partner-icon { - @extend %with-icon, %partner-svg-prop; - background-image: var(--partner-svg); + @extend %with-icon, %users-16-svg-prop; + background-image: var(--users-16-svg); } %with-partner-mask { - @extend %with-mask, %partner-svg-prop; - -webkit-mask-image: var(--partner-svg); - mask-image: var(--partner-svg); + @extend %with-mask, %users-16-svg-prop; + -webkit-mask-image: var(--users-16-svg); + mask-image: var(--users-16-svg); } %with-path-16-icon { @@ -6979,13 +7559,13 @@ } %with-path-icon { - @extend %with-icon, %path-svg-prop; - background-image: var(--path-svg); + @extend %with-icon, %path-16-svg-prop; + background-image: var(--path-16-svg); } %with-path-mask { - @extend %with-mask, %path-svg-prop; - -webkit-mask-image: var(--path-svg); - mask-image: var(--path-svg); + @extend %with-mask, %path-16-svg-prop; + -webkit-mask-image: var(--path-16-svg); + mask-image: var(--path-16-svg); } %with-pause-16-icon { @@ -7209,33 +7789,33 @@ } %with-play-fill-icon { - @extend %with-icon, %play-fill-svg-prop; - background-image: var(--play-fill-svg); + @extend %with-icon, %play-circle-16-svg-prop; + background-image: var(--play-circle-16-svg); } %with-play-fill-mask { - @extend %with-mask, %play-fill-svg-prop; - -webkit-mask-image: var(--play-fill-svg); - mask-image: var(--play-fill-svg); + @extend %with-mask, %play-circle-16-svg-prop; + -webkit-mask-image: var(--play-circle-16-svg); + mask-image: var(--play-circle-16-svg); } %with-play-outline-icon { - @extend %with-icon, %play-outline-svg-prop; - background-image: var(--play-outline-svg); + @extend %with-icon, %play-circle-16-svg-prop; + background-image: var(--play-circle-16-svg); } %with-play-outline-mask { - @extend %with-mask, %play-outline-svg-prop; - -webkit-mask-image: var(--play-outline-svg); - mask-image: var(--play-outline-svg); + @extend %with-mask, %play-circle-16-svg-prop; + -webkit-mask-image: var(--play-circle-16-svg); + mask-image: var(--play-circle-16-svg); } %with-play-plain-icon { - @extend %with-icon, %play-plain-svg-prop; - background-image: var(--play-plain-svg); + @extend %with-icon, %play-16-svg-prop; + background-image: var(--play-16-svg); } %with-play-plain-mask { - @extend %with-mask, %play-plain-svg-prop; - -webkit-mask-image: var(--play-plain-svg); - mask-image: var(--play-plain-svg); + @extend %with-mask, %play-16-svg-prop; + -webkit-mask-image: var(--play-16-svg); + mask-image: var(--play-16-svg); } %with-plus-16-icon { @@ -7279,33 +7859,33 @@ } %with-plus-circle-fill-icon { - @extend %with-icon, %plus-circle-fill-svg-prop; - background-image: var(--plus-circle-fill-svg); + @extend %with-icon, %plus-circle-16-svg-prop; + background-image: var(--plus-circle-16-svg); } %with-plus-circle-fill-mask { - @extend %with-mask, %plus-circle-fill-svg-prop; - -webkit-mask-image: var(--plus-circle-fill-svg); - mask-image: var(--plus-circle-fill-svg); + @extend %with-mask, %plus-circle-16-svg-prop; + -webkit-mask-image: var(--plus-circle-16-svg); + mask-image: var(--plus-circle-16-svg); } %with-plus-circle-outline-icon { - @extend %with-icon, %plus-circle-outline-svg-prop; - background-image: var(--plus-circle-outline-svg); + @extend %with-icon, %plus-circle-16-svg-prop; + background-image: var(--plus-circle-16-svg); } %with-plus-circle-outline-mask { - @extend %with-mask, %plus-circle-outline-svg-prop; - -webkit-mask-image: var(--plus-circle-outline-svg); - mask-image: var(--plus-circle-outline-svg); + @extend %with-mask, %plus-circle-16-svg-prop; + -webkit-mask-image: var(--plus-circle-16-svg); + mask-image: var(--plus-circle-16-svg); } %with-plus-plain-icon { - @extend %with-icon, %plus-plain-svg-prop; - background-image: var(--plus-plain-svg); + @extend %with-icon, %plus-16-svg-prop; + background-image: var(--plus-16-svg); } %with-plus-plain-mask { - @extend %with-mask, %plus-plain-svg-prop; - -webkit-mask-image: var(--plus-plain-svg); - mask-image: var(--plus-plain-svg); + @extend %with-mask, %plus-16-svg-prop; + -webkit-mask-image: var(--plus-16-svg); + mask-image: var(--plus-16-svg); } %with-plus-square-16-icon { @@ -7329,13 +7909,13 @@ } %with-plus-square-fill-icon { - @extend %with-icon, %plus-square-fill-svg-prop; - background-image: var(--plus-square-fill-svg); + @extend %with-icon, %plus-square-16-svg-prop; + background-image: var(--plus-square-16-svg); } %with-plus-square-fill-mask { - @extend %with-mask, %plus-square-fill-svg-prop; - -webkit-mask-image: var(--plus-square-fill-svg); - mask-image: var(--plus-square-fill-svg); + @extend %with-mask, %plus-square-16-svg-prop; + -webkit-mask-image: var(--plus-square-16-svg); + mask-image: var(--plus-square-16-svg); } %with-port-icon { @@ -7419,33 +7999,33 @@ } %with-provider-icon { - @extend %with-icon, %provider-svg-prop; - background-image: var(--provider-svg); + @extend %with-icon, %provider-16-svg-prop; + background-image: var(--provider-16-svg); } %with-provider-mask { - @extend %with-mask, %provider-svg-prop; - -webkit-mask-image: var(--provider-svg); - mask-image: var(--provider-svg); + @extend %with-mask, %provider-16-svg-prop; + -webkit-mask-image: var(--provider-16-svg); + mask-image: var(--provider-16-svg); } %with-public-default-icon { - @extend %with-icon, %public-default-svg-prop; - background-image: var(--public-default-svg); + @extend %with-icon, %globe-16-svg-prop; + background-image: var(--globe-16-svg); } %with-public-default-mask { - @extend %with-mask, %public-default-svg-prop; - -webkit-mask-image: var(--public-default-svg); - mask-image: var(--public-default-svg); + @extend %with-mask, %globe-16-svg-prop; + -webkit-mask-image: var(--globe-16-svg); + mask-image: var(--globe-16-svg); } %with-public-locked-icon { - @extend %with-icon, %public-locked-svg-prop; - background-image: var(--public-locked-svg); + @extend %with-icon, %globe-private-16-svg-prop; + background-image: var(--globe-private-16-svg); } %with-public-locked-mask { - @extend %with-mask, %public-locked-svg-prop; - -webkit-mask-image: var(--public-locked-svg); - mask-image: var(--public-locked-svg); + @extend %with-mask, %globe-private-16-svg-prop; + -webkit-mask-image: var(--globe-private-16-svg); + mask-image: var(--globe-private-16-svg); } %with-queue-16-icon { @@ -7469,13 +8049,13 @@ } %with-queue-icon { - @extend %with-icon, %queue-svg-prop; - background-image: var(--queue-svg); + @extend %with-icon, %queue-16-svg-prop; + background-image: var(--queue-16-svg); } %with-queue-mask { - @extend %with-mask, %queue-svg-prop; - -webkit-mask-image: var(--queue-svg); - mask-image: var(--queue-svg); + @extend %with-mask, %queue-16-svg-prop; + -webkit-mask-image: var(--queue-16-svg); + mask-image: var(--queue-16-svg); } %with-radio-16-icon { @@ -7499,23 +8079,23 @@ } %with-radio-button-checked-icon { - @extend %with-icon, %radio-button-checked-svg-prop; - background-image: var(--radio-button-checked-svg); + @extend %with-icon, %circle-dot-16-svg-prop; + background-image: var(--circle-dot-16-svg); } %with-radio-button-checked-mask { - @extend %with-mask, %radio-button-checked-svg-prop; - -webkit-mask-image: var(--radio-button-checked-svg); - mask-image: var(--radio-button-checked-svg); + @extend %with-mask, %circle-dot-16-svg-prop; + -webkit-mask-image: var(--circle-dot-16-svg); + mask-image: var(--circle-dot-16-svg); } %with-radio-button-unchecked-icon { - @extend %with-icon, %radio-button-unchecked-svg-prop; - background-image: var(--radio-button-unchecked-svg); + @extend %with-icon, %circle-16-svg-prop; + background-image: var(--circle-16-svg); } %with-radio-button-unchecked-mask { - @extend %with-mask, %radio-button-unchecked-svg-prop; - -webkit-mask-image: var(--radio-button-unchecked-svg); - mask-image: var(--radio-button-unchecked-svg); + @extend %with-mask, %circle-16-svg-prop; + -webkit-mask-image: var(--circle-16-svg); + mask-image: var(--circle-16-svg); } %with-random-16-icon { @@ -7539,13 +8119,13 @@ } %with-random-icon { - @extend %with-icon, %random-svg-prop; - background-image: var(--random-svg); + @extend %with-icon, %random-16-svg-prop; + background-image: var(--random-16-svg); } %with-random-mask { - @extend %with-mask, %random-svg-prop; - -webkit-mask-image: var(--random-svg); - mask-image: var(--random-svg); + @extend %with-mask, %random-16-svg-prop; + -webkit-mask-image: var(--random-16-svg); + mask-image: var(--random-16-svg); } %with-redirect-16-icon { @@ -7569,33 +8149,33 @@ } %with-redirect-icon { - @extend %with-icon, %redirect-svg-prop; - background-image: var(--redirect-svg); + @extend %with-icon, %redirect-16-svg-prop; + background-image: var(--redirect-16-svg); } %with-redirect-mask { - @extend %with-mask, %redirect-svg-prop; - -webkit-mask-image: var(--redirect-svg); - mask-image: var(--redirect-svg); + @extend %with-mask, %redirect-16-svg-prop; + -webkit-mask-image: var(--redirect-16-svg); + mask-image: var(--redirect-16-svg); } %with-refresh-alert-icon { - @extend %with-icon, %refresh-alert-svg-prop; - background-image: var(--refresh-alert-svg); + @extend %with-icon, %sync-alert-16-svg-prop; + background-image: var(--sync-alert-16-svg); } %with-refresh-alert-mask { - @extend %with-mask, %refresh-alert-svg-prop; - -webkit-mask-image: var(--refresh-alert-svg); - mask-image: var(--refresh-alert-svg); + @extend %with-mask, %sync-alert-16-svg-prop; + -webkit-mask-image: var(--sync-alert-16-svg); + mask-image: var(--sync-alert-16-svg); } %with-refresh-default-icon { - @extend %with-icon, %refresh-default-svg-prop; - background-image: var(--refresh-default-svg); + @extend %with-icon, %sync-16-svg-prop; + background-image: var(--sync-16-svg); } %with-refresh-default-mask { - @extend %with-mask, %refresh-default-svg-prop; - -webkit-mask-image: var(--refresh-default-svg); - mask-image: var(--refresh-default-svg); + @extend %with-mask, %sync-16-svg-prop; + -webkit-mask-image: var(--sync-16-svg); + mask-image: var(--sync-16-svg); } %with-reload-16-icon { @@ -7619,13 +8199,13 @@ } %with-remix-icon { - @extend %with-icon, %remix-svg-prop; - background-image: var(--remix-svg); + @extend %with-icon, %shuffle-16-svg-prop; + background-image: var(--shuffle-16-svg); } %with-remix-mask { - @extend %with-mask, %remix-svg-prop; - -webkit-mask-image: var(--remix-svg); - mask-image: var(--remix-svg); + @extend %with-mask, %shuffle-16-svg-prop; + -webkit-mask-image: var(--shuffle-16-svg); + mask-image: var(--shuffle-16-svg); } %with-repeat-16-icon { @@ -7709,13 +8289,13 @@ } %with-ribbon-icon { - @extend %with-icon, %ribbon-svg-prop; - background-image: var(--ribbon-svg); + @extend %with-icon, %award-16-svg-prop; + background-image: var(--award-16-svg); } %with-ribbon-mask { - @extend %with-mask, %ribbon-svg-prop; - -webkit-mask-image: var(--ribbon-svg); - mask-image: var(--ribbon-svg); + @extend %with-mask, %award-16-svg-prop; + -webkit-mask-image: var(--award-16-svg); + mask-image: var(--award-16-svg); } %with-rocket-16-icon { @@ -7879,13 +8459,13 @@ } %with-search-icon { - @extend %with-icon, %search-svg-prop; - background-image: var(--search-svg); + @extend %with-icon, %search-16-svg-prop; + background-image: var(--search-16-svg); } %with-search-mask { - @extend %with-mask, %search-svg-prop; - -webkit-mask-image: var(--search-svg); - mask-image: var(--search-svg); + @extend %with-mask, %search-16-svg-prop; + -webkit-mask-image: var(--search-16-svg); + mask-image: var(--search-16-svg); } %with-send-16-icon { @@ -7989,13 +8569,13 @@ } %with-settings-icon { - @extend %with-icon, %settings-svg-prop; - background-image: var(--settings-svg); + @extend %with-icon, %settings-16-svg-prop; + background-image: var(--settings-16-svg); } %with-settings-mask { - @extend %with-mask, %settings-svg-prop; - -webkit-mask-image: var(--settings-svg); - mask-image: var(--settings-svg); + @extend %with-mask, %settings-16-svg-prop; + -webkit-mask-image: var(--settings-16-svg); + mask-image: var(--settings-16-svg); } %with-share-16-icon { @@ -8549,23 +9129,23 @@ } %with-sort-icon { - @extend %with-icon, %sort-svg-prop; - background-image: var(--sort-svg); + @extend %with-icon, %sort-desc-16-svg-prop; + background-image: var(--sort-desc-16-svg); } %with-sort-mask { - @extend %with-mask, %sort-svg-prop; - -webkit-mask-image: var(--sort-svg); - mask-image: var(--sort-svg); + @extend %with-mask, %sort-desc-16-svg-prop; + -webkit-mask-image: var(--sort-desc-16-svg); + mask-image: var(--sort-desc-16-svg); } %with-source-file-icon { - @extend %with-icon, %source-file-svg-prop; - background-image: var(--source-file-svg); + @extend %with-icon, %file-source-16-svg-prop; + background-image: var(--file-source-16-svg); } %with-source-file-mask { - @extend %with-mask, %source-file-svg-prop; - -webkit-mask-image: var(--source-file-svg); - mask-image: var(--source-file-svg); + @extend %with-mask, %file-source-16-svg-prop; + -webkit-mask-image: var(--file-source-16-svg); + mask-image: var(--file-source-16-svg); } %with-speaker-16-icon { @@ -8689,13 +9269,13 @@ } %with-star-fill-icon { - @extend %with-icon, %star-fill-svg-prop; - background-image: var(--star-fill-svg); + @extend %with-icon, %star-fill-16-svg-prop; + background-image: var(--star-fill-16-svg); } %with-star-fill-mask { - @extend %with-mask, %star-fill-svg-prop; - -webkit-mask-image: var(--star-fill-svg); - mask-image: var(--star-fill-svg); + @extend %with-mask, %star-fill-16-svg-prop; + -webkit-mask-image: var(--star-fill-16-svg); + mask-image: var(--star-fill-16-svg); } %with-star-off-16-icon { @@ -8719,13 +9299,13 @@ } %with-star-outline-icon { - @extend %with-icon, %star-outline-svg-prop; - background-image: var(--star-outline-svg); + @extend %with-icon, %star-16-svg-prop; + background-image: var(--star-16-svg); } %with-star-outline-mask { - @extend %with-mask, %star-outline-svg-prop; - -webkit-mask-image: var(--star-outline-svg); - mask-image: var(--star-outline-svg); + @extend %with-mask, %star-16-svg-prop; + -webkit-mask-image: var(--star-16-svg); + mask-image: var(--star-16-svg); } %with-stop-circle-16-icon { @@ -8749,23 +9329,23 @@ } %with-sub-left-icon { - @extend %with-icon, %sub-left-svg-prop; - background-image: var(--sub-left-svg); + @extend %with-icon, %corner-down-left-16-svg-prop; + background-image: var(--corner-down-left-16-svg); } %with-sub-left-mask { - @extend %with-mask, %sub-left-svg-prop; - -webkit-mask-image: var(--sub-left-svg); - mask-image: var(--sub-left-svg); + @extend %with-mask, %corner-down-left-16-svg-prop; + -webkit-mask-image: var(--corner-down-left-16-svg); + mask-image: var(--corner-down-left-16-svg); } %with-sub-right-icon { - @extend %with-icon, %sub-right-svg-prop; - background-image: var(--sub-right-svg); + @extend %with-icon, %corner-down-right-16-svg-prop; + background-image: var(--corner-down-right-16-svg); } %with-sub-right-mask { - @extend %with-mask, %sub-right-svg-prop; - -webkit-mask-image: var(--sub-right-svg); - mask-image: var(--sub-right-svg); + @extend %with-mask, %corner-down-right-16-svg-prop; + -webkit-mask-image: var(--corner-down-right-16-svg); + mask-image: var(--corner-down-right-16-svg); } %with-sun-16-icon { @@ -8809,13 +9389,13 @@ } %with-support-icon { - @extend %with-icon, %support-svg-prop; - background-image: var(--support-svg); + @extend %with-icon, %support-16-svg-prop; + background-image: var(--support-16-svg); } %with-support-mask { - @extend %with-mask, %support-svg-prop; - -webkit-mask-image: var(--support-svg); - mask-image: var(--support-svg); + @extend %with-mask, %support-16-svg-prop; + -webkit-mask-image: var(--support-16-svg); + mask-image: var(--support-16-svg); } %with-swap-horizontal-16-icon { @@ -8839,13 +9419,13 @@ } %with-swap-horizontal-icon { - @extend %with-icon, %swap-horizontal-svg-prop; - background-image: var(--swap-horizontal-svg); + @extend %with-icon, %swap-horizontal-16-svg-prop; + background-image: var(--swap-horizontal-16-svg); } %with-swap-horizontal-mask { - @extend %with-mask, %swap-horizontal-svg-prop; - -webkit-mask-image: var(--swap-horizontal-svg); - mask-image: var(--swap-horizontal-svg); + @extend %with-mask, %swap-horizontal-16-svg-prop; + -webkit-mask-image: var(--swap-horizontal-16-svg); + mask-image: var(--swap-horizontal-16-svg); } %with-swap-vertical-16-icon { @@ -8869,13 +9449,13 @@ } %with-swap-vertical-icon { - @extend %with-icon, %swap-vertical-svg-prop; - background-image: var(--swap-vertical-svg); + @extend %with-icon, %swap-vertical-16-svg-prop; + background-image: var(--swap-vertical-16-svg); } %with-swap-vertical-mask { - @extend %with-mask, %swap-vertical-svg-prop; - -webkit-mask-image: var(--swap-vertical-svg); - mask-image: var(--swap-vertical-svg); + @extend %with-mask, %swap-vertical-16-svg-prop; + -webkit-mask-image: var(--swap-vertical-16-svg); + mask-image: var(--swap-vertical-16-svg); } %with-switcher-16-icon { @@ -8999,13 +9579,13 @@ } %with-tag-icon { - @extend %with-icon, %tag-svg-prop; - background-image: var(--tag-svg); + @extend %with-icon, %tag-16-svg-prop; + background-image: var(--tag-16-svg); } %with-tag-mask { - @extend %with-mask, %tag-svg-prop; - -webkit-mask-image: var(--tag-svg); - mask-image: var(--tag-svg); + @extend %with-mask, %tag-16-svg-prop; + -webkit-mask-image: var(--tag-16-svg); + mask-image: var(--tag-16-svg); } %with-target-16-icon { @@ -9068,6 +9648,46 @@ mask-image: var(--terminal-screen-24-svg); } +%with-terraform-16-icon { + @extend %with-icon, %terraform-16-svg-prop; + background-image: var(--terraform-16-svg); +} +%with-terraform-16-mask { + @extend %with-mask, %terraform-16-svg-prop; + -webkit-mask-image: var(--terraform-16-svg); + mask-image: var(--terraform-16-svg); +} + +%with-terraform-24-icon { + @extend %with-icon, %terraform-24-svg-prop; + background-image: var(--terraform-24-svg); +} +%with-terraform-24-mask { + @extend %with-mask, %terraform-24-svg-prop; + -webkit-mask-image: var(--terraform-24-svg); + mask-image: var(--terraform-24-svg); +} + +%with-terraform-color-16-icon { + @extend %with-icon, %terraform-color-16-svg-prop; + background-image: var(--terraform-color-16-svg); +} +%with-terraform-color-16-mask { + @extend %with-mask, %terraform-color-16-svg-prop; + -webkit-mask-image: var(--terraform-color-16-svg); + mask-image: var(--terraform-color-16-svg); +} + +%with-terraform-color-24-icon { + @extend %with-icon, %terraform-color-24-svg-prop; + background-image: var(--terraform-color-24-svg); +} +%with-terraform-color-24-mask { + @extend %with-mask, %terraform-color-24-svg-prop; + -webkit-mask-image: var(--terraform-color-24-svg); + mask-image: var(--terraform-color-24-svg); +} + %with-thumbs-down-16-icon { @extend %with-icon, %thumbs-down-16-svg-prop; background-image: var(--thumbs-down-16-svg); @@ -9229,13 +9849,13 @@ } %with-trash-icon { - @extend %with-icon, %trash-svg-prop; - background-image: var(--trash-svg); + @extend %with-icon, %trash-16-svg-prop; + background-image: var(--trash-16-svg); } %with-trash-mask { - @extend %with-mask, %trash-svg-prop; - -webkit-mask-image: var(--trash-svg); - mask-image: var(--trash-svg); + @extend %with-mask, %trash-16-svg-prop; + -webkit-mask-image: var(--trash-16-svg); + mask-image: var(--trash-16-svg); } %with-trend-down-16-icon { @@ -9339,13 +9959,13 @@ } %with-tune-icon { - @extend %with-icon, %tune-svg-prop; - background-image: var(--tune-svg); + @extend %with-icon, %sliders-16-svg-prop; + background-image: var(--sliders-16-svg); } %with-tune-mask { - @extend %with-mask, %tune-svg-prop; - -webkit-mask-image: var(--tune-svg); - mask-image: var(--tune-svg); + @extend %with-mask, %sliders-16-svg-prop; + -webkit-mask-image: var(--sliders-16-svg); + mask-image: var(--sliders-16-svg); } %with-tv-16-icon { @@ -9368,6 +9988,86 @@ mask-image: var(--tv-24-svg); } +%with-twitch-16-icon { + @extend %with-icon, %twitch-16-svg-prop; + background-image: var(--twitch-16-svg); +} +%with-twitch-16-mask { + @extend %with-mask, %twitch-16-svg-prop; + -webkit-mask-image: var(--twitch-16-svg); + mask-image: var(--twitch-16-svg); +} + +%with-twitch-24-icon { + @extend %with-icon, %twitch-24-svg-prop; + background-image: var(--twitch-24-svg); +} +%with-twitch-24-mask { + @extend %with-mask, %twitch-24-svg-prop; + -webkit-mask-image: var(--twitch-24-svg); + mask-image: var(--twitch-24-svg); +} + +%with-twitch-color-16-icon { + @extend %with-icon, %twitch-color-16-svg-prop; + background-image: var(--twitch-color-16-svg); +} +%with-twitch-color-16-mask { + @extend %with-mask, %twitch-color-16-svg-prop; + -webkit-mask-image: var(--twitch-color-16-svg); + mask-image: var(--twitch-color-16-svg); +} + +%with-twitch-color-24-icon { + @extend %with-icon, %twitch-color-24-svg-prop; + background-image: var(--twitch-color-24-svg); +} +%with-twitch-color-24-mask { + @extend %with-mask, %twitch-color-24-svg-prop; + -webkit-mask-image: var(--twitch-color-24-svg); + mask-image: var(--twitch-color-24-svg); +} + +%with-twitter-16-icon { + @extend %with-icon, %twitter-16-svg-prop; + background-image: var(--twitter-16-svg); +} +%with-twitter-16-mask { + @extend %with-mask, %twitter-16-svg-prop; + -webkit-mask-image: var(--twitter-16-svg); + mask-image: var(--twitter-16-svg); +} + +%with-twitter-24-icon { + @extend %with-icon, %twitter-24-svg-prop; + background-image: var(--twitter-24-svg); +} +%with-twitter-24-mask { + @extend %with-mask, %twitter-24-svg-prop; + -webkit-mask-image: var(--twitter-24-svg); + mask-image: var(--twitter-24-svg); +} + +%with-twitter-color-16-icon { + @extend %with-icon, %twitter-color-16-svg-prop; + background-image: var(--twitter-color-16-svg); +} +%with-twitter-color-16-mask { + @extend %with-mask, %twitter-color-16-svg-prop; + -webkit-mask-image: var(--twitter-color-16-svg); + mask-image: var(--twitter-color-16-svg); +} + +%with-twitter-color-24-icon { + @extend %with-icon, %twitter-color-24-svg-prop; + background-image: var(--twitter-color-24-svg); +} +%with-twitter-color-24-mask { + @extend %with-mask, %twitter-color-24-svg-prop; + -webkit-mask-image: var(--twitter-color-24-svg); + mask-image: var(--twitter-color-24-svg); +} + %with-type-16-icon { @extend %with-icon, %type-16-svg-prop; background-image: var(--type-16-svg); @@ -9409,23 +10109,23 @@ } %with-unfold-less-icon { - @extend %with-icon, %unfold-less-svg-prop; - background-image: var(--unfold-less-svg); + @extend %with-icon, %unfold-close-16-svg-prop; + background-image: var(--unfold-close-16-svg); } %with-unfold-less-mask { - @extend %with-mask, %unfold-less-svg-prop; - -webkit-mask-image: var(--unfold-less-svg); - mask-image: var(--unfold-less-svg); + @extend %with-mask, %unfold-close-16-svg-prop; + -webkit-mask-image: var(--unfold-close-16-svg); + mask-image: var(--unfold-close-16-svg); } %with-unfold-more-icon { - @extend %with-icon, %unfold-more-svg-prop; - background-image: var(--unfold-more-svg); + @extend %with-icon, %unfold-open-16-svg-prop; + background-image: var(--unfold-open-16-svg); } %with-unfold-more-mask { - @extend %with-mask, %unfold-more-svg-prop; - -webkit-mask-image: var(--unfold-more-svg); - mask-image: var(--unfold-more-svg); + @extend %with-mask, %unfold-open-16-svg-prop; + -webkit-mask-image: var(--unfold-open-16-svg); + mask-image: var(--unfold-open-16-svg); } %with-unfold-open-16-icon { @@ -9449,11 +10149,11 @@ } %with-union-icon { - @extend %with-icon, %union-svg; + @extend %with-icon, %union-svg-prop; background-image: var(--union-svg); } %with-union-mask { - @extend %with-mask, %union-svg; + @extend %with-mask, %union-svg-prop; -webkit-mask-image: var(--union-svg); mask-image: var(--union-svg); } @@ -9499,13 +10199,13 @@ } %with-upload-icon { - @extend %with-icon, %upload-svg-prop; - background-image: var(--upload-svg); + @extend %with-icon, %upload-16-svg-prop; + background-image: var(--upload-16-svg); } %with-upload-mask { - @extend %with-mask, %upload-svg-prop; - -webkit-mask-image: var(--upload-svg); - mask-image: var(--upload-svg); + @extend %with-mask, %upload-16-svg-prop; + -webkit-mask-image: var(--upload-16-svg); + mask-image: var(--upload-16-svg); } %with-user-16-icon { @@ -9529,13 +10229,13 @@ } %with-user-add-icon { - @extend %with-icon, %user-add-svg-prop; - background-image: var(--user-add-svg); + @extend %with-icon, %user-plus-16-svg-prop; + background-image: var(--user-plus-16-svg); } %with-user-add-mask { - @extend %with-mask, %user-add-svg-prop; - -webkit-mask-image: var(--user-add-svg); - mask-image: var(--user-add-svg); + @extend %with-mask, %user-plus-16-svg-prop; + -webkit-mask-image: var(--user-plus-16-svg); + mask-image: var(--user-plus-16-svg); } %with-user-check-16-icon { @@ -9619,23 +10319,23 @@ } %with-user-organization-icon { - @extend %with-icon, %user-organization-svg-prop; - background-image: var(--user-organization-svg); + @extend %with-icon, %org-16-svg-prop; + background-image: var(--org-16-svg); } %with-user-organization-mask { - @extend %with-mask, %user-organization-svg-prop; - -webkit-mask-image: var(--user-organization-svg); - mask-image: var(--user-organization-svg); + @extend %with-mask, %org-16-svg-prop; + -webkit-mask-image: var(--org-16-svg); + mask-image: var(--org-16-svg); } %with-user-plain-icon { - @extend %with-icon, %user-plain-svg-prop; - background-image: var(--user-plain-svg); + @extend %with-icon, %user-16-svg-prop; + background-image: var(--user-16-svg); } %with-user-plain-mask { - @extend %with-mask, %user-plain-svg-prop; - -webkit-mask-image: var(--user-plain-svg); - mask-image: var(--user-plain-svg); + @extend %with-mask, %user-16-svg-prop; + -webkit-mask-image: var(--user-16-svg); + mask-image: var(--user-16-svg); } %with-user-plus-16-icon { @@ -9659,33 +10359,33 @@ } %with-user-square-fill-icon { - @extend %with-icon, %user-square-fill-svg-prop; - background-image: var(--user-square-fill-svg); + @extend %with-icon, %user-circle-fill-16-svg-prop; + background-image: var(--user-circle-fill-16-svg); } %with-user-square-fill-mask { - @extend %with-mask, %user-square-fill-svg-prop; - -webkit-mask-image: var(--user-square-fill-svg); - mask-image: var(--user-square-fill-svg); + @extend %with-mask, %user-circle-fill-16-svg-prop; + -webkit-mask-image: var(--user-circle-fill-16-svg); + mask-image: var(--user-circle-fill-16-svg); } %with-user-square-outline-icon { - @extend %with-icon, %user-square-outline-svg-prop; - background-image: var(--user-square-outline-svg); + @extend %with-icon, %user-circle-16-svg-prop; + background-image: var(--user-circle-16-svg); } %with-user-square-outline-mask { - @extend %with-mask, %user-square-outline-svg-prop; - -webkit-mask-image: var(--user-square-outline-svg); - mask-image: var(--user-square-outline-svg); + @extend %with-mask, %user-circle-16-svg-prop; + -webkit-mask-image: var(--user-circle-16-svg); + mask-image: var(--user-circle-16-svg); } %with-user-team-icon { - @extend %with-icon, %user-team-svg-prop; - background-image: var(--user-team-svg); + @extend %with-icon, %users-16-svg-prop; + background-image: var(--users-16-svg); } %with-user-team-mask { - @extend %with-mask, %user-team-svg-prop; - -webkit-mask-image: var(--user-team-svg); - mask-image: var(--user-team-svg); + @extend %with-mask, %users-16-svg-prop; + -webkit-mask-image: var(--users-16-svg); + mask-image: var(--users-16-svg); } %with-user-x-16-icon { @@ -9728,6 +10428,46 @@ mask-image: var(--users-24-svg); } +%with-vagrant-16-icon { + @extend %with-icon, %vagrant-16-svg-prop; + background-image: var(--vagrant-16-svg); +} +%with-vagrant-16-mask { + @extend %with-mask, %vagrant-16-svg-prop; + -webkit-mask-image: var(--vagrant-16-svg); + mask-image: var(--vagrant-16-svg); +} + +%with-vagrant-24-icon { + @extend %with-icon, %vagrant-24-svg-prop; + background-image: var(--vagrant-24-svg); +} +%with-vagrant-24-mask { + @extend %with-mask, %vagrant-24-svg-prop; + -webkit-mask-image: var(--vagrant-24-svg); + mask-image: var(--vagrant-24-svg); +} + +%with-vagrant-color-16-icon { + @extend %with-icon, %vagrant-color-16-svg-prop; + background-image: var(--vagrant-color-16-svg); +} +%with-vagrant-color-16-mask { + @extend %with-mask, %vagrant-color-16-svg-prop; + -webkit-mask-image: var(--vagrant-color-16-svg); + mask-image: var(--vagrant-color-16-svg); +} + +%with-vagrant-color-24-icon { + @extend %with-icon, %vagrant-color-24-svg-prop; + background-image: var(--vagrant-color-24-svg); +} +%with-vagrant-color-24-mask { + @extend %with-mask, %vagrant-color-24-svg-prop; + -webkit-mask-image: var(--vagrant-color-24-svg); + mask-image: var(--vagrant-color-24-svg); +} + %with-vault-16-icon { @extend %with-icon, %vault-16-svg-prop; background-image: var(--vault-16-svg); @@ -9748,6 +10488,26 @@ mask-image: var(--vault-24-svg); } +%with-vault-color-16-icon { + @extend %with-icon, %vault-color-16-svg-prop; + background-image: var(--vault-color-16-svg); +} +%with-vault-color-16-mask { + @extend %with-mask, %vault-color-16-svg-prop; + -webkit-mask-image: var(--vault-color-16-svg); + mask-image: var(--vault-color-16-svg); +} + +%with-vault-color-24-icon { + @extend %with-icon, %vault-color-24-svg-prop; + background-image: var(--vault-color-24-svg); +} +%with-vault-color-24-mask { + @extend %with-mask, %vault-color-24-svg-prop; + -webkit-mask-image: var(--vault-color-24-svg); + mask-image: var(--vault-color-24-svg); +} + %with-verified-16-icon { @extend %with-icon, %verified-16-svg-prop; background-image: var(--verified-16-svg); @@ -9809,23 +10569,23 @@ } %with-visibility-hide-icon { - @extend %with-icon, %visibility-hide-svg-prop; - background-image: var(--visibility-hide-svg); + @extend %with-icon, %eye-off-16-svg-prop; + background-image: var(--eye-off-16-svg); } %with-visibility-hide-mask { - @extend %with-mask, %visibility-hide-svg-prop; - -webkit-mask-image: var(--visibility-hide-svg); - mask-image: var(--visibility-hide-svg); + @extend %with-mask, %eye-off-16-svg-prop; + -webkit-mask-image: var(--eye-off-16-svg); + mask-image: var(--eye-off-16-svg); } %with-visibility-show-icon { - @extend %with-icon, %visibility-show-svg-prop; - background-image: var(--visibility-show-svg); + @extend %with-icon, %eye-16-svg-prop; + background-image: var(--eye-16-svg); } %with-visibility-show-mask { - @extend %with-mask, %visibility-show-svg-prop; - -webkit-mask-image: var(--visibility-show-svg); - mask-image: var(--visibility-show-svg); + @extend %with-mask, %eye-16-svg-prop; + -webkit-mask-image: var(--eye-16-svg); + mask-image: var(--eye-16-svg); } %with-vmware-16-icon { @@ -9988,6 +10748,46 @@ mask-image: var(--watch-24-svg); } +%with-waypoint-16-icon { + @extend %with-icon, %waypoint-16-svg-prop; + background-image: var(--waypoint-16-svg); +} +%with-waypoint-16-mask { + @extend %with-mask, %waypoint-16-svg-prop; + -webkit-mask-image: var(--waypoint-16-svg); + mask-image: var(--waypoint-16-svg); +} + +%with-waypoint-24-icon { + @extend %with-icon, %waypoint-24-svg-prop; + background-image: var(--waypoint-24-svg); +} +%with-waypoint-24-mask { + @extend %with-mask, %waypoint-24-svg-prop; + -webkit-mask-image: var(--waypoint-24-svg); + mask-image: var(--waypoint-24-svg); +} + +%with-waypoint-color-16-icon { + @extend %with-icon, %waypoint-color-16-svg-prop; + background-image: var(--waypoint-color-16-svg); +} +%with-waypoint-color-16-mask { + @extend %with-mask, %waypoint-color-16-svg-prop; + -webkit-mask-image: var(--waypoint-color-16-svg); + mask-image: var(--waypoint-color-16-svg); +} + +%with-waypoint-color-24-icon { + @extend %with-icon, %waypoint-color-24-svg-prop; + background-image: var(--waypoint-color-24-svg); +} +%with-waypoint-color-24-mask { + @extend %with-mask, %waypoint-color-24-svg-prop; + -webkit-mask-image: var(--waypoint-color-24-svg); + mask-image: var(--waypoint-color-24-svg); +} + %with-webhook-16-icon { @extend %with-icon, %webhook-16-svg-prop; background-image: var(--webhook-16-svg); @@ -10009,13 +10809,13 @@ } %with-webhook-icon { - @extend %with-icon, %webhook-svg-prop; - background-image: var(--webhook-svg); + @extend %with-icon, %webhook-16-svg-prop; + background-image: var(--webhook-16-svg); } %with-webhook-mask { - @extend %with-mask, %webhook-svg-prop; - -webkit-mask-image: var(--webhook-svg); - mask-image: var(--webhook-svg); + @extend %with-mask, %webhook-16-svg-prop; + -webkit-mask-image: var(--webhook-16-svg); + mask-image: var(--webhook-16-svg); } %with-wifi-16-icon { @@ -10258,6 +11058,46 @@ mask-image: var(--x-square-fill-24-svg); } +%with-youtube-16-icon { + @extend %with-icon, %youtube-16-svg-prop; + background-image: var(--youtube-16-svg); +} +%with-youtube-16-mask { + @extend %with-mask, %youtube-16-svg-prop; + -webkit-mask-image: var(--youtube-16-svg); + mask-image: var(--youtube-16-svg); +} + +%with-youtube-24-icon { + @extend %with-icon, %youtube-24-svg-prop; + background-image: var(--youtube-24-svg); +} +%with-youtube-24-mask { + @extend %with-mask, %youtube-24-svg-prop; + -webkit-mask-image: var(--youtube-24-svg); + mask-image: var(--youtube-24-svg); +} + +%with-youtube-color-16-icon { + @extend %with-icon, %youtube-color-16-svg-prop; + background-image: var(--youtube-color-16-svg); +} +%with-youtube-color-16-mask { + @extend %with-mask, %youtube-color-16-svg-prop; + -webkit-mask-image: var(--youtube-color-16-svg); + mask-image: var(--youtube-color-16-svg); +} + +%with-youtube-color-24-icon { + @extend %with-icon, %youtube-color-24-svg-prop; + background-image: var(--youtube-color-24-svg); +} +%with-youtube-color-24-mask { + @extend %with-mask, %youtube-color-24-svg-prop; + -webkit-mask-image: var(--youtube-color-24-svg); + mask-image: var(--youtube-color-24-svg); +} + %with-zap-16-icon { @extend %with-icon, %zap-16-svg-prop; background-image: var(--zap-16-svg); diff --git a/ui/packages/consul-ui/app/styles/debug.scss b/ui/packages/consul-ui/app/styles/debug.scss index 5ca08667b7..bb52730089 100644 --- a/ui/packages/consul-ui/app/styles/debug.scss +++ b/ui/packages/consul-ui/app/styles/debug.scss @@ -1,4 +1,3 @@ -@import './app'; @import './base/icons/debug'; @import 'prism-coldark-dark'; diff --git a/ui/packages/consul-ui/app/styles/icons.scss b/ui/packages/consul-ui/app/styles/icons.scss index 96eac426b8..0ab6ec6c64 100644 --- a/ui/packages/consul-ui/app/styles/icons.scss +++ b/ui/packages/consul-ui/app/styles/icons.scss @@ -1,4 +1,71 @@ +%with-vault-100 { + @extend %with-vault-16-mask, %as-pseudo; + color: rgb(var(--tone-vault-500)); +} %with-vault-300 { @extend %with-vault-16-mask, %as-pseudo; color: rgb(var(--tone-vault-500)); } +%with-aws-100, +%with-aws-300 { + @extend %aws-color-16-svg-prop; + @extend %with-icon, %as-pseudo; + + background-image: var(--theme-dark-none) var(--aws-color-16-svg); + + -webkit-mask-image: var(--theme-light-none) var(--aws-color-16-svg); + -webkit-mask-repeat: var(--theme-light-none) no-repeat; + -webkit-mask-position: var(--theme-light-none) center; + mask-image: var(--theme-light-none) var(--aws-color-16-svg); + mask-repeat: var(--theme-light-none) no-repeat; + mask-position: var(--theme-light-none) center; + background-color: var(--theme-light-none) rgb(var(--white)); +} +%with-allow-100, +%with-aws-100, +%with-deny-100, +%with-l7-100, +%with-vault-100 { + width: 0.75rem; /* 12px */ + height: 0.75rem; /* 12px */ +} +%with-allow-500, +%with-deny-500, +%with-l7-500 { + width: 1.25rem; /* 20px */ + height: 1.25rem; /* 20px */ +} +%with-allow-300, +%with-allow-500 { + color: rgb(var(--tone-green-500)); +} +%with-deny-300, +%with-deny-500 { + color: rgb(var(--tone-red-500)); +} +%with-allow-300, +%with-allow-500, +%with-deny-300, +%with-deny-500, +%with-l7-300, +%with-l7-500 { + @extend %as-pseudo; +} +%with-allow-300 { + @extend %with-arrow-right-16-mask; +} +%with-allow-500 { + @extend %with-arrow-right-24-mask; +} +%with-deny-300 { + @extend %with-skip-16-mask; +} +%with-deny-500 { + @extend %with-skip-24-mask; +} +%with-l7-300 { + @extend %with-layers-16-mask; +} +%with-l7-500 { + @extend %with-layers-24-mask; +} diff --git a/ui/packages/consul-ui/ember-cli-build.js b/ui/packages/consul-ui/ember-cli-build.js index 7884e859b1..ec8397f89c 100644 --- a/ui/packages/consul-ui/ember-cli-build.js +++ b/ui/packages/consul-ui/ember-cli-build.js @@ -97,14 +97,8 @@ module.exports = function(defaults, $ = process.env) { // exclude docfy '@docfy/ember' ]; - } else { - // add debug css is we are not in test or production environments - outputPaths.app = { - css: { - 'debug': '/assets/debug.css' - } - } } + if(['production'].includes(env)) { // everything apart from production is 'debug', including test // which means this and everything it affects is never tested diff --git a/ui/packages/consul-ui/lib/colocated-components/index.js b/ui/packages/consul-ui/lib/colocated-components/index.js index 33428463f1..ef3a1130ac 100644 --- a/ui/packages/consul-ui/lib/colocated-components/index.js +++ b/ui/packages/consul-ui/lib/colocated-components/index.js @@ -3,6 +3,8 @@ const Funnel = require('broccoli-funnel'); const mergeTrees = require('broccoli-merge-trees'); +const writeFile = require('broccoli-file-creator'); +const read = require('fs').readFileSync; module.exports = { name: require('./package').name, @@ -12,15 +14,18 @@ module.exports = { * @import 'app-name/components/component-name/index.scss' */ treeForStyles: function(tree) { + let debug = read(`${this.project.root}/app/styles/debug.scss`); + if (['production', 'test'].includes(process.env.EMBER_ENV)) { + debug = ''; + } return this._super.treeForStyles.apply(this, [ - mergeTrees( - (tree || []).concat([ - new Funnel(`${this.project.root}/app/components`, { - destDir: `app/components`, - include: ['**/*.scss'], - }), - ]) - ), + mergeTrees([ + writeFile(`_debug.scss`, debug), + new Funnel(`${this.project.root}/app/components`, { + destDir: `app/components`, + include: ['**/*.scss'], + }), + ]), ]); }, }; diff --git a/ui/packages/consul-ui/lib/startup/templates/head.html.js b/ui/packages/consul-ui/lib/startup/templates/head.html.js index 1d8d38ea01..fc2c7dd49b 100644 --- a/ui/packages/consul-ui/lib/startup/templates/head.html.js +++ b/ui/packages/consul-ui/lib/startup/templates/head.html.js @@ -8,9 +8,7 @@ module.exports = ({ appName, environment, rootURL, config }) => ` - + ${ environment === 'test' ? `` : `` } diff --git a/ui/packages/consul-ui/package.json b/ui/packages/consul-ui/package.json index 5c4035202e..18bb4e6ad6 100644 --- a/ui/packages/consul-ui/package.json +++ b/ui/packages/consul-ui/package.json @@ -63,6 +63,7 @@ "@glimmer/component": "^1.0.0", "@glimmer/tracking": "^1.0.0", "@hashicorp/ember-cli-api-double": "^3.1.0", + "@lit/reactive-element": "^1.2.1", "@mapbox/rehype-prism": "^0.6.0", "@xstate/fsm": "^1.4.0", "a11y-dialog": "^6.0.1", @@ -79,8 +80,8 @@ "chalk": "^4.1.0", "clipboard": "^2.0.4", "consul-acls": "*", - "consul-partitions": "*", "consul-nspaces": "*", + "consul-partitions": "*", "css.escape": "^1.5.1", "d3-array": "^2.8.0", "d3-scale": "^3.2.3", diff --git a/ui/yarn.lock b/ui/yarn.lock index e9d89fefac..d61667fbd7 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1560,6 +1560,11 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@lit/reactive-element@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.2.1.tgz#8620d7f0baf63e12821fa93c34d21e23477736f7" + integrity sha512-03FYfMguIWo9E1y1qcTpXzoO8Ukpn0j5o4GjNFq/iHqJEPY6pYopsU44e7NSFIgCTorr8wdUU5PfVy8VeD6Rwg== + "@mapbox/rehype-prism@^0.6.0": version "0.6.0" resolved "https://registry.yarnpkg.com/@mapbox/rehype-prism/-/rehype-prism-0.6.0.tgz#3d8a860870951d4354257d0ba908d11545bd5ed5" diff --git a/website/components/footer/index.jsx b/website/components/footer/index.jsx index 86d72cb193..6df5112338 100644 --- a/website/components/footer/index.jsx +++ b/website/components/footer/index.jsx @@ -21,8 +21,8 @@ export default function Footer({ openConsentManager }) { Security - - Press Kit + + Brand Consent Manager diff --git a/website/content/commands/connect/redirect-traffic.mdx b/website/content/commands/connect/redirect-traffic.mdx index 27313d5367..fef0dc716b 100644 --- a/website/content/commands/connect/redirect-traffic.mdx +++ b/website/content/commands/connect/redirect-traffic.mdx @@ -36,6 +36,8 @@ Usage: `consul connect redirect-traffic [options]` #### Options for Traffic Redirection Rules +- `-consul-dns-ip` - The IP address of the Consul DNS resolver. If provided, DNS queries will be redirected to the provided IP address for name resolution. + - `-proxy-id` - The [proxy service](/docs/connect/registration/service-registration) ID. This service ID must already be registered with the local agent. @@ -47,13 +49,13 @@ Usage: `consul connect redirect-traffic [options]` - `-exclude-inbound-port` - Inbound port to exclude from traffic redirection. May be provided multiple times. -- `exclude-outbound-cidr` - Outbound CIDR to exclude from traffic redirection. May be provided multiple times. +- `-exclude-outbound-cidr` - Outbound CIDR to exclude from traffic redirection. May be provided multiple times. -- `exclude-outbound-port` - Outbound port to exclude from traffic redirection. May be provided multiple times. +- `-exclude-outbound-port` - Outbound port to exclude from traffic redirection. May be provided multiple times. -- `exclude-uid` - Additional user ID to exclude from traffic redirection. May be provided multiple times. +- `-exclude-uid` - Additional user ID to exclude from traffic redirection. May be provided multiple times. -- `netns` - The Linux network namespace where traffic redirection rules should apply. +- `-netns` - The Linux network namespace where traffic redirection rules should apply. This must be a path to the network namespace, e.g. /var/run/netns/foo. #### Enterprise Options diff --git a/website/content/docs/agent/telemetry.mdx b/website/content/docs/agent/telemetry.mdx index 9bb2ef5399..136c634d1f 100644 --- a/website/content/docs/agent/telemetry.mdx +++ b/website/content/docs/agent/telemetry.mdx @@ -388,7 +388,7 @@ These metrics are used to monitor the health of the Consul servers. | Metric | Description | Unit | Type | | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------- | | `consul.acl.ResolveToken` | Measures the time it takes to resolve an ACL token. | ms | timer | -| `consul.acl.ResolveTokenToIdentity` | Measures the time it takes to resolve an ACL token to an Identity. | ms | timer | +| `consul.acl.ResolveTokenToIdentity` | Measures the time it takes to resolve an ACL token to an Identity. This metric was removed in Consul 1.12. The time will now be reflected in `consul.acl.ResolveToken`. | ms | timer | | `consul.acl.token.cache_hit` | Increments if Consul is able to resolve a token's identity, or a legacy token, from the cache. | cache read op | counter | | `consul.acl.token.cache_miss` | Increments if Consul cannot resolve a token's identity, or a legacy token, from the cache. | cache read op | counter | | `consul.cache.bypass` | Counts how many times a request bypassed the cache because no cache-key was provided. | counter | counter | diff --git a/website/content/docs/api-gateway.mdx b/website/content/docs/api-gateway.mdx index 229ba0e9ec..7c1c096b92 100644 --- a/website/content/docs/api-gateway.mdx +++ b/website/content/docs/api-gateway.mdx @@ -21,10 +21,10 @@ Consul API Gateway implements the Kubernetes [Gateway API Specification](https:/ Your datacenter must meet the following requirements prior to configuring the Consul API Gateway: -- A Kubernetes cluster must be running +- Kubernetes 1.21+ - `kubectl` 1.21+ - Consul 1.11.2+ -- HashiCorp Helm chart 0.40.0+ +- HashiCorp Consul Helm chart 0.40.0+ ## Installation @@ -38,7 +38,7 @@ Your datacenter must meet the following requirements prior to configuring the Co -1. Create a values file for your Consul server agents that contains the following parameters: +1. Create a `values.yaml` file for your Consul API Gateway deployment. Copy the content below into the `values.yaml` file. The `values.yaml` will be used by the Consul Helm chart. See [Helm Chart Configuration - apigateway](https://www.consul.io/docs/k8s/helm#apigateway) for more available options on how to configure your Consul API Gateway deployment via the Helm chart. diff --git a/website/content/docs/connect/config-entries/ingress-gateway.mdx b/website/content/docs/connect/config-entries/ingress-gateway.mdx index cc3f1014e5..918177e4c4 100644 --- a/website/content/docs/connect/config-entries/ingress-gateway.mdx +++ b/website/content/docs/connect/config-entries/ingress-gateway.mdx @@ -600,7 +600,12 @@ spec: protocol: http services: - name: api - # HTTP Header manipulation is not supported in Kubernetes CRD + requestHeaders: + add: + x-gateway: us-east-ingress + responseHeaders: + remove: + - x-debug ``` ```json @@ -676,7 +681,12 @@ spec: services: - name: api namespace: frontend - # HTTP Header manipulation is not supported in Kubernetes CRD + requestHeaders: + add: + x-gateway: us-east-ingress + responseHeaders: + remove: + - x-debug ``` ```json @@ -981,21 +991,25 @@ You can specify the following parameters to configure ingress gateway configurat }, { name: 'TLSMinVersion', + yaml: false, type: 'string: ""', - description: "Set the default minimum TLS version supported for the gateway's listeners. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. If unspecified, Envoy v1.22.0 and newer [will default to TLS 1.2 as a min version](https://github.com/envoyproxy/envoy/pull/19330), while older releases of Envoy default to TLS 1.0.", + description: + "Set the default minimum TLS version supported for the gateway's listeners. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. If unspecified, Envoy v1.22.0 and newer [will default to TLS 1.2 as a min version](https://github.com/envoyproxy/envoy/pull/19330), while older releases of Envoy default to TLS 1.0.", }, { name: 'TLSMaxVersion', + yaml: false, type: 'string: ""', description: { hcl: - "Set the default maximum TLS version supported for the gateway's listeners. Must be greater than or equal to `TLSMinVersion`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`." , + "Set the default maximum TLS version supported for the gateway's listeners. Must be greater than or equal to `TLSMinVersion`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`.", yaml: - "Set the default maximum TLS version supported for the gateway's listeners. Must be greater than or equal to `tls_min_version`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`." , + "Set the default maximum TLS version supported for the gateway's listeners. Must be greater than or equal to `tls_min_version`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`.", }, }, { name: 'CipherSuites', + yaml: false, type: 'array: ', description: `Set the default list of TLS cipher suites for the gateway's listeners to support when negotiating connections using @@ -1007,11 +1021,10 @@ You can specify the following parameters to configure ingress gateway configurat releases of Envoy may remove currently-supported but insecure cipher suites, and future releases of Consul may add new supported cipher suites if any are added to - Envoy.` + Envoy.`, }, { name: 'SDS', - yaml: false, type: 'SDSConfig: ', description: 'Defines a set of parameters that configures the gateway to load TLS certificates from an external SDS service. See [SDS](/docs/connect/gateways/ingress-gateway#sds) for more details on usage.

SDS properties defined in this field are used as defaults for all listeners on the gateway.', @@ -1105,7 +1118,6 @@ You can specify the following parameters to configure ingress gateway configurat \`*-suffix.example.com\` are not.`, }, { - yaml: false, name: 'RequestHeaders', type: 'HTTPHeaderModifiers: ', description: `A set of [HTTP-specific header modification rules](/docs/connect/config-entries/service-router#httpheadermodifiers) @@ -1113,7 +1125,6 @@ You can specify the following parameters to configure ingress gateway configurat This cannot be used with a \`tcp\` listener.`, }, { - yaml: false, name: 'ResponseHeaders', type: 'HTTPHeaderModifiers: ', description: `A set of [HTTP-specific header modification rules](/docs/connect/config-entries/service-router#httpheadermodifiers) @@ -1122,7 +1133,6 @@ You can specify the following parameters to configure ingress gateway configurat }, { name: 'TLS', - yaml: false, type: 'ServiceTLSConfig: ', description: 'TLS configuration for this service.', children: [ @@ -1154,7 +1164,6 @@ You can specify the following parameters to configure ingress gateway configurat }, { name: 'TLS', - yaml: false, type: 'TLSConfig: ', description: 'TLS configuration for this listener.', children: [ @@ -1165,26 +1174,26 @@ You can specify the following parameters to configure ingress gateway configurat hcl: "Set this configuration to `true` to enable built-in TLS for this listener.

If TLS is enabled, then each host defined in each service's `Hosts` field will be added as a DNSSAN to the gateway's x509 certificate. Note that even hosts from other listeners with TLS disabled will be added. TLS can not be disabled for individual listeners if it is enabled on the gateway.", yaml: - "Set this configuration to `true` to enable built-in TLS for this listener.

If TLS is enabled, then each host defined in the `hosts` field will be added as a DNSSAN to the gateway's x509 certificate. Note that even hosts from other listeners with TLS disabled will be added. TLS can not be disabled for individual listeners if it is enabled on the gateway.", + "Set this configuration to `true` to enable built-in TLS for this listener.

If TLS is enabled, then each host defined in each service's `hosts` field will be added as a DNSSAN to the gateway's x509 certificate. Note that even hosts from other listeners with TLS disabled will be added. TLS can not be disabled for individual listeners if it is enabled on the gateway.", }, }, { name: 'TLSMinVersion', + yaml: false, type: 'string: ""', - description: "Set the minimum TLS version supported for this listener. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. If unspecified, Envoy v1.22.0 and newer [will default to TLS 1.2 as a min version](https://github.com/envoyproxy/envoy/pull/19330), while older releases of Envoy default to TLS 1.0.", + description: + 'Set the minimum TLS version supported for this listener. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`. If unspecified, Envoy v1.22.0 and newer [will default to TLS 1.2 as a min version](https://github.com/envoyproxy/envoy/pull/19330), while older releases of Envoy default to TLS 1.0.', }, { name: 'TLSMaxVersion', + yaml: false, type: 'string: ""', - description: { - hcl: - "Set the maximum TLS version supported for this listener. Must be greater than or equal to `TLSMinVersion`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`." , - yaml: - "Set the maximum TLS version supported for this listener. Must be greater than or equal to `tls_min_version`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`." , - }, + description: + 'Set the maximum TLS version supported for this listener. Must be greater than or equal to `TLSMinVersion`. One of `TLS_AUTO`, `TLSv1_0`, `TLSv1_1`, `TLSv1_2`, or `TLSv1_3`.', }, { name: 'CipherSuites', + yaml: false, type: 'array: ', description: `Set the list of TLS cipher suites to support when negotiating connections using TLS 1.2 or earlier. If unspecified, @@ -1195,7 +1204,7 @@ You can specify the following parameters to configure ingress gateway configurat and is dependent on underlying support in Envoy. Future releases of Envoy may remove currently-supported but insecure cipher suites, and future releases of Consul - may add new supported cipher suites if any are added to Envoy.` + may add new supported cipher suites if any are added to Envoy.`, }, { name: 'SDS', diff --git a/website/content/docs/connect/config-entries/service-router.mdx b/website/content/docs/connect/config-entries/service-router.mdx index 5814173045..6a7ba3373e 100644 --- a/website/content/docs/connect/config-entries/service-router.mdx +++ b/website/content/docs/connect/config-entries/service-router.mdx @@ -36,10 +36,9 @@ service of the same name. to any configured [`service-resolver`](/docs/connect/config-entries/service-resolver). -## UI +## UI - -Once a `service-router` is successfully entered, you can view it in the UI. Service routers, service splitters, and service resolvers can all be viewed by clicking on your service then switching to the *routing* tab. +Once a `service-router` is successfully entered, you can view it in the UI. Service routers, service splitters, and service resolvers can all be viewed by clicking on your service then switching to the _routing_ tab. ![screenshot of service router in the UI](/img/l7-routing/Router.png) @@ -309,14 +308,16 @@ spec: name: 'Namespace', type: `string: "default"`, enterprise: true, - description: 'Specifies the namespace to which the configuration entry will apply.', + description: + 'Specifies the namespace to which the configuration entry will apply.', yaml: false, }, { name: 'Partition', type: `string: "default"`, enterprise: true, - description: 'Specifies the admin partition to which the configuration will apply.', + description: + 'Specifies the admin partition to which the configuration will apply.', yaml: false, }, { @@ -596,7 +597,6 @@ spec: 'A list of HTTP response status codes that are eligible for retry.', }, { - yaml: false, name: 'RequestHeaders', type: 'HTTPHeaderModifiers: ', description: `A set of [HTTP-specific header modification rules](/docs/connect/config-entries/service-router#httpheadermodifiers) @@ -604,7 +604,6 @@ spec: This cannot be used with a \`tcp\` listener.`, }, { - yaml: false, name: 'ResponseHeaders', type: 'HTTPHeaderModifiers: ', description: `A set of [HTTP-specific header modification rules](/docs/connect/config-entries/service-router#httpheadermodifiers) @@ -614,21 +613,12 @@ spec: ]} /> - ### `HTTPHeaderModifiers` : optional', description: `The set of key/value pairs that specify header values to add. @@ -641,7 +631,6 @@ spec: metadata into the value added.`, }, { - yaml: false, name: 'Set', type: 'map: optional', description: `The set of key/value pairs that specify header values to add. @@ -654,7 +643,6 @@ spec: metadata into the value added.`, }, { - yaml: false, name: 'Remove', type: 'array: optional', description: `The set of header names to remove. Only headers diff --git a/website/content/docs/connect/config-entries/service-splitter.mdx b/website/content/docs/connect/config-entries/service-splitter.mdx index cf279dbf2c..bc5d709ce5 100644 --- a/website/content/docs/connect/config-entries/service-splitter.mdx +++ b/website/content/docs/connect/config-entries/service-splitter.mdx @@ -39,9 +39,9 @@ resolution stage. to any configured [`service-resolver`](/docs/connect/config-entries/service-resolver). -## UI +## UI -Once a `service-splitter` is successfully entered, you can view it in the UI. Service routers, service splitters, and service resolvers can all be viewed by clicking on your service then switching to the *routing* tab. +Once a `service-splitter` is successfully entered, you can view it in the UI. Service routers, service splitters, and service resolvers can all be viewed by clicking on your service then switching to the _routing_ tab. ![screenshot of service splitter in the UI](/img/l7-routing/Splitter.png) @@ -152,13 +152,12 @@ spec: - ### Set HTTP Headers Split traffic between two subsets with extra headers added so clients can tell -which version (not yet supported in Kubernetes CRD): +which version: - + ```hcl Kind = "service-splitter" @@ -185,6 +184,25 @@ Splits = [ ] ``` +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceSplitter +metadata: + name: web +spec: + splits: + - weight: 90 + serviceSubset: v1 + responseHeaders: + set: + x-web-version: v1 + - weight: 10 + serviceSubset: v2 + responseHeaders: + set: + x-web-version: v2 +``` + ```json { "Kind": "service-splitter", @@ -240,14 +258,16 @@ Splits = [ name: 'Namespace', type: `string: "default"`, enterprise: true, - description: 'Specifies the namespace to which the configuration entry will apply.', + description: + 'Specifies the namespace to which the configuration entry will apply.', yaml: false, }, { name: 'Partition', type: `string: "default"`, enterprise: true, - description: 'Specifies the admin partition to which the configuration entry will apply.', + description: + 'Specifies the admin partition to which the configuration entry will apply.', yaml: false, }, { @@ -314,7 +334,6 @@ Splits = [ 'The admin partition to resolve the service from instead of the current partition. If empty, the current partition is used.', }, { - yaml: false, name: 'RequestHeaders', type: 'HTTPHeaderModifiers: ', description: `A set of [HTTP-specific header modification rules](/docs/connect/config-entries/service-router#httpheadermodifiers) @@ -322,7 +341,6 @@ Splits = [ This cannot be used with a \`tcp\` listener.`, }, { - yaml: false, name: 'ResponseHeaders', type: 'HTTPHeaderModifiers: ', description: `A set of [HTTP-specific header modification rules](/docs/connect/config-entries/service-router#httpheadermodifiers) diff --git a/website/content/docs/connect/proxies/built-in.mdx b/website/content/docs/connect/proxies/built-in.mdx index c37c0e94fa..fd1330c8d7 100644 --- a/website/content/docs/connect/proxies/built-in.mdx +++ b/website/content/docs/connect/proxies/built-in.mdx @@ -13,7 +13,6 @@ The [Envoy proxy](/docs/connect/proxies/envoy) should be used for production dep Consul comes with a built-in L4 proxy for testing and development with Consul Connect service mesh. - ## Getting Started To get started with the built-in proxy and see a working example you can follow the [Getting Started](https://learn.hashicorp.com/tutorials/consul/get-started-service-networking) tutorial. @@ -57,10 +56,9 @@ All fields are optional with a reasonable default. _public_ mTLS listener to. It defaults to the same address the agent binds to. - `bind_port` - The port the proxy will bind its _public_ - mTLS listener to. If not provided, the agent will attempt to assign one from its - [configured proxy port range](/docs/agent/options#sidecar_min_port) if available. - By default the range is [20000, 20255] and the port is selected at random from - that range. + mTLS listener to. If not provided, the agent will assign a random port from its + configured proxy port range specified by [`sidecar_min_port`](/docs/agent/options#sidecar_min_port) + and [`sidecar_max_port`](/docs/agent/options#sidecar_max_port). - `local_service_address`- The `[address]:port` that the proxy should use to connect to the local application instance. By default diff --git a/website/content/docs/connect/registration/sidecar-service.mdx b/website/content/docs/connect/registration/sidecar-service.mdx index 850d954b3d..c08bd17916 100644 --- a/website/content/docs/connect/registration/sidecar-service.mdx +++ b/website/content/docs/connect/registration/sidecar-service.mdx @@ -130,9 +130,9 @@ proxy. - `name` - Defaults to being `-sidecar-proxy`. - `tags` - Defaults to the tags of the parent service. - `meta` - Defaults to the service metadata of the parent service. -- `port` - Defaults to being auto-assigned from a [configurable - range](/docs/agent/options#sidecar_min_port) that is - by default `[21000, 21255]`. +- `port` - Defaults to being auto-assigned from a configurable + range specified by [`sidecar_min_port`](/docs/agent/options#sidecar_min_port) + and [`sidecar_max_port`](/docs/agent/options#sidecar_max_port). - `kind` - Defaults to `connect-proxy`. This can't be overridden currently. - `check`, `checks` - By default we add a TCP check on the local address and port for the proxy, and a [service alias diff --git a/website/content/docs/install/index.mdx b/website/content/docs/install/index.mdx index f85405f96a..da8d113fcc 100644 --- a/website/content/docs/install/index.mdx +++ b/website/content/docs/install/index.mdx @@ -38,33 +38,57 @@ command-line, make sure to place it somewhere on your `PATH`. ## Compiling from Source To compile from source, you will need [Go](https://golang.org) installed and -configured properly (including a `GOPATH` environment variable set), as well as a copy of [`git`](https://www.git-scm.com/) in your `PATH`. -1. Clone the Consul repository from GitHub into your `GOPATH`: +1. Clone the Consul repository from GitHub: ```shell - $ mkdir -p $GOPATH/src/github.com/hashicorp && cd !$ $ git clone https://github.com/hashicorp/consul.git $ cd consul ``` -1. Bootstrap the project. This will download and compile libraries and tools - needed to compile Consul: +1. Build Consul for your target system. The binary will be placed in `./bin` + (relative to the git checkout). - ```shell - $ make tools + + + + + + ```shell-session + $ make dev ``` -1. Build Consul for your current system and put the binary in `./bin/` - (relative to the git checkout). The `make dev` target is just a shortcut that - builds `consul` for only your local build environment (no cross-compiled - targets). + + - ```shell + Specify your target system by setting the following environment variables + before building: + + - `GOOS`: Target operating system. Valid values include: + `linux`, `darwin`, `windows`, `solaris`, `freebsd`. + - `GOARCH`: Target architecture. Valid values include: + `386`, `amd64`, `arm`, `arm64` + + ```shell-session + $ export GOOS=linux GOARCH=amd64 $ make dev ``` + + + ## Verifying the Installation To verify Consul is properly installed, run `consul version` on your system. You diff --git a/website/content/docs/intro/index.mdx b/website/content/docs/intro/index.mdx index fe1fe65a15..6dd5f6fe98 100644 --- a/website/content/docs/intro/index.mdx +++ b/website/content/docs/intro/index.mdx @@ -1,6 +1,6 @@ --- layout: docs -page_title: Intro to Consul +page_title: What is Consul? description: >- Welcome to the intro guide to Consul! This guide is the best place to start with Consul. We cover what Consul is, what problems it can solve, how it diff --git a/website/content/docs/intro/usecases/index.mdx b/website/content/docs/intro/usecases/index.mdx new file mode 100644 index 0000000000..2f2b4b324e --- /dev/null +++ b/website/content/docs/intro/usecases/index.mdx @@ -0,0 +1,9 @@ +--- +layout: docs +page_title: usecases +description: >- + Consul Service Mesh can be deployed on AWS ECS (Elastic Container Service). + This section documents the official installation of Consul on ECS. +--- + +lals diff --git a/website/content/docs/intro/usecases/what-is-a-service-mesh.mdx b/website/content/docs/intro/usecases/what-is-a-service-mesh.mdx new file mode 100644 index 0000000000..a999bd3fe0 --- /dev/null +++ b/website/content/docs/intro/usecases/what-is-a-service-mesh.mdx @@ -0,0 +1,119 @@ +--- +layout: docs +page_title: What is a service mesh? +description: >- + Learn what a service mesh is, its benefits, and how it works. + A service mesh can solve many of the modern challenges that exist in multi-platform and multi-cloud application architectures, ranging from security to application resiliency. +--- + +# What is a Service Mesh? + +A _service mesh_ is a dedicated network layer that provides secure service-to-service communication within and across infrastructure, including on-premises and cloud environments. +Service meshes are often used with a microservice architectural pattern, but can provide value in any scenario where complex networking is involved. + +## Benefits of a service mesh + +A service mesh provides benefits for all organizations, ranging from security to improved application resiliency. +Some of the benefits of a service mesh include; + +- service discovery +- application health monitoring +- load balancing +- automatic failover +- traffic management +- encryption +- observability and traceability, +- authentication and authorization, +- network automation + +A common use case for leveraging a service mesh is to achieve a [_zero trust_ model](/use-cases/zero-trust-networking). +In a zero trust model, applications require identity-based access to ensure all communication within the service mesh is authenticated with TLS certificates and encrypted in transit. + +In traditional security strategies, protection is primarily focused at the perimeter of a network. +In cloud environments, the surface area for network access is much wider than the traditional on-premises networks. +In addition, traditional security practices overlook the fact that many bad actors can originate from within the network walls. +A zero trust model addresses these concerns while allowing organizations to scale as needed. + +## How does a service mesh work? + +A service mesh typically consist of a control plane and a data plane. The control plane maintains a central registry that keeps track of all services and their respective IP addresses. This activity is called [service discovery](https://www.hashicorp.com/products/consul/service-discovery-and-health-checking). +As long as the application is registered with the control plane, the control plane will be able to share with other members of the mesh how to communicate with the application and enforce rules for who can communicate with each other. + +The control plane is responsible for securing the mesh, facilitating service discovery, health checking, policy enforcement, and other similar operational concerns. + +The data plane handles communication between services. +Many service mesh solutions employ a sidecar proxy to handle data plane communications, and thus limit the level of awareness the services need to have about the network environment. + +![Overview of a service mesh](/img/what_is_service_mesh_1.png) + +## API gateway vs service mesh + +An API gateway is a centralized access point for handling incoming client requests and delivering them to services. +The API gateway acts as a control plane that allows operators and developers to manage incoming client requests and apply different handling logic depending on the request. +The API gateway will route the incoming requests to the respective service. The primary function of an API gateway is to handle requests and return the reply from the service back to the client. + +A service mesh specializes in the network management of services and the communication between services. +The mesh is responsible for keeping track of services and their health status, IP address, and traffic routing and ensuring all traffic between services is authenticated and encrypted. +Unlike API gateways, a service mesh will track all registered services' lifecycle and ensure requests are routed to healthy instances of the service. +API gateways are frequently deployed alongside a load balancer to ensure traffic is directed to healthy and available instances of the service. +The mesh reduces the load balancer footprint as routing responsibilities are handled in a decentralized manner. + +API gateways can be used with a service mesh to bridge external networks (non-mesh) with a service mesh. + +-> **API gateways and traffic direction**: API gateways are often used to accept north-south traffic. North-south traffic is networking traffic that either enters or exits a data center or a virtual private network (VPC). +A service mesh is primarily used for handling east-west traffic. East-west traffic traditionally remains inside a data center or a VPC. +A service mesh can be connected to another service mesh in another data center or VPC to form a federated mesh. + +## What problems does a service mesh solve? + +Modern infrastructure is transitioning from being primarily static to dynamic in nature (ephemeral). +This dynamic infrastructure has a short life cycle, meaning virtual machines (VM) and containers are frequently recycled. +It's difficult for an organization to manage and keep track of application services that live on short-lived resources. A service mesh solves this problem by acting as a central registry of all registered services. +As instances of a service (e.g., VM, container, serverless functions) come up and down, the mesh is aware of their state and availability. The ability to conduct _service discovery_ is the foundation to the other problems a service mesh solves. + +As a service mesh is aware of the state of a service and its instances, the mesh can implement more intelligent and dynamic network routing. +Many service meshes offer L7 traffic management capabilities. As a result, operators and developers can create powerful rules to direct network traffic as needed, such as load balancing, traffic splitting, dynamic failover, and custom resolvers. +A service mesh's dynamic network behavior allows application owners to improve application resiliency and availability with no application changes. + +Implementing dynamic network behavior is critical as more and more applications are deployed across different cloud providers (multi-cloud) and private data centers. +Organizations may need to route network traffic to other infrastructure environments. Ensuring this traffic is secure is on top of mind for all organizations. +Service meshes offer the ability to enforce network traffic encryption (mTLS) and authentication between all services. The service mesh can automatically generate an SSL certificate for each service and its instances. +The certificate authenticates with other services inside the mesh and encrypts the TCP/UDP/gRPC connection with SSL. + +Fine-grained policies that dictate what services are allowed to communicate with each other is another benefit of a service mesh. +Traditionally, services are permitted to communicate with other services through firewall rules. +The traditional firewall (IP-based) model is difficult to enforce with dynamic infrastructure resources with a short lifecycle and frequently recycling IP addresses. +As a result, network administrators have to open up network ranges to permit network traffic between services without differentiating the services generating the network traffic. However, a service mesh allows operators and developers to shift away from an IP-based model and focus more on service to service permissions. +An operator defines a policy that only allows _service A_ to communicate with _service B_. Otherwise, the default action is to deny the traffic. +This shift from an IP address-based security model to a service-focused model reduces the overhead of securing network traffic and allows an organization to take advantage of multi-cloud environments without sacrificing security due to complexity. + +## How do you implement a service mesh? + +Service meshes are commonly installed in Kubernetes clusters. There are also platform-agnostic service meshes available for non-Kubernetes-based workloads. +For Kubernetes, most service meshes can be installed by operators through a [Helm chart](https://helm.sh/). Additionally, the service mesh may offer a CLI tool that supports the installation and maintenance of the service mesh. +Non-Kubernetes based service meshes can be installed through infrastructure as code (IaC) products such as [Terraform](https://www.terraform.io/), CloudFormation, ARM Templates, Puppet, Chef, etc. + +## What is a multi platform service mesh? + +A multi-platform service mesh is capable of supporting various infrastructure environments. +This can range from having the service mesh support Kubernetes and non-Kubernetes workloads, to having a service mesh span across various cloud environments (multi-cloud and hybrid cloud). + +## What is Consul? + +Consul is a multi-networking tool that offers a fully-featured service mesh solution that solves the networking and security challenges of operating microservices and cloud infrastructure (multi-cloud and hybrid cloud). +Consul offers a software-driven approach to routing and segmentation. It also brings additional benefits such as failure handling, retries, and network observability. +Each of these features can be used individually as needed or they can be used together to build a full service mesh and achieve [zero trust](https://www.hashicorp.com/solutions/zero-trust-security) security. +In simple terms, Consul is the control plane of the service mesh. The data plane is supported by Consul through its first class support of [Envoy](https://www.envoyproxy.io/) as a proxy. + +You can use Consul with virtual machines (VMs), containers, or with container orchestration platforms, such as [Nomad](https://www.nomadproject.io/) and Kubernetes. +Consul is platform agnostic which makes it a great fit for all environments, including legacy platforms. + +Consul is available as a [self-install](/downloads) project or as a fully managed service mesh solution called [HCP Consul](https://portal.cloud.hashicorp.com/sign-in?utm_source=consul_docs). +HCP Consul enables users to discover and securely connect services without the added operational burden of maintaining a service mesh on their own. + +You can learn more about Consul by visting the Consul Learn [tutorials](https://learn.hashicorp.com/consul). + +## Next + +Get started today with a service mesh by leveraging [HCP Consul](https://portal.cloud.hashicorp.com/sign-in?utm_source=consul_docs). +Prepare your organization for the future of multi-cloud and embrace a [zero-trust](https://www.hashicorp.com/solutions/zero-trust-security) architecture. diff --git a/website/content/docs/k8s/connect/ingress-controllers.mdx b/website/content/docs/k8s/connect/ingress-controllers.mdx index e8e4c06d18..b814d12415 100644 --- a/website/content/docs/k8s/connect/ingress-controllers.mdx +++ b/website/content/docs/k8s/connect/ingress-controllers.mdx @@ -12,7 +12,9 @@ description: Configuring Ingress Controllers With Consul On Kubernetes [Transparent Proxy](/docs/connect/transparent-proxy) mode enabled. This page describes a general approach for integrating Ingress Controllers with Consul on Kubernetes to secure traffic from the Controller -to the backend services. This allows Consul to transparently secure traffic from the ingress point through the entire traffic flow of the service. +to the backend services by deploying sidecars along with your Ingress Controller. This allows Consul to transparently secure traffic from the ingress point through the entire traffic flow of the service. + +If you are looking for a fully supported solution for ingress traffic into Consul Service Mesh, please visit [Consul API Gateway](https://www.consul.io/docs/api-gateway) for instruction on how to install Consul API Gateway along with Consul on Kubernetes. A few steps are generally required to enable an Ingress controller to join the mesh and pass traffic through to a service: diff --git a/website/content/docs/k8s/installation/install.mdx b/website/content/docs/k8s/installation/install.mdx index 9d0543519f..e128ccef04 100644 --- a/website/content/docs/k8s/installation/install.mdx +++ b/website/content/docs/k8s/installation/install.mdx @@ -27,7 +27,7 @@ mesh](https://learn.hashicorp.com/tutorials/consul/service-mesh-deploy?utm_sourc ## Consul K8s CLI Installation -We recommend using the [Consul K8S CLI](/docs/k8s/k8s-cli) to install Consul on Kubernetes for single-cluster deployments. You can install Consul on Kubernetes using the Consul K8s CLI tool after installing the CLI. +We recommend using the [Consul K8s CLI](/docs/k8s/k8s-cli) to install Consul on Kubernetes for single-cluster deployments. You can install Consul on Kubernetes using the Consul K8s CLI tool after installing the CLI. Before beginning the installation process, verify that `kubectl` is already configured to authenticate to the Kubernetes cluster using a valid `kubeconfig` file. @@ -45,38 +45,58 @@ The [Homebrew](https://brew.sh) package manager is required to complete the foll $ brew install hashicorp/tap/consul-k8s ``` -1. Issue the `install` subcommand to install Consul on Kubernetes: +1. Issue the `install` subcommand to install Consul on Kubernetes. Refer to the [Consul K8s CLI reference](/docs/k8s/k8s-cli) for details about all commands and available options. Without any additional options passed, the `consul-k8s` CLI will install Consul on Kubernetes by using the Consul Helm chart's default values. Below is an example that installs Consul on Kubernetes with Service Mesh and CRDs enabled. If you did not set the `-auto-approve` option to `true`, you will be prompted to proceed with the installation if the pre-install checks pass. - ```shell-session - consul-k8s install - ``` - - Refer to the [Consul K8s CLI reference](/docs/k8s/k8s-cli) for details about all commands and available options. + -> The pre-install checks may fail if existing `PersistentVolumeClaims` (PVC) are detected. Refer to the [uninstall instructions](/docs/k8s/operations/uninstall#uninstall-consul) for information about removing PVCs. + + ```shell-session + $ consul-k8s install -set connectInject.enabled=true -set controller.enabled=true - If you did not set the `-auto-approve` option to `true`, you will be prompted to proceed with the installation if the pre-install checks pass. - - ```shell-session - ==> Pre-Install Checks - ✓ No existing installations found + ==> Pre-Install Checks + No existing installations found. ✓ No previous persistent volume claims found ✓ No previous secrets found - ==> Consul Installation Summary - Installation name: consul - Namespace: myns - Overrides: - connectInject: - enabled: true - global: - name: consul - server: - bootstrapExpect: 1 - replicas: 1 - - Proceed with installation? (y/n) - ``` - -1. Enter `y` to proceed. The pre-install checks may fail if existing `PersistentVolumeClaims` (PVC) are detected. Refer to the [uninstall instructions](/docs/k8s/operations/uninstall#uninstall-consul) for information about removing PVCs. + ==> Consul Installation Summary + Installation name: consul + Namespace: consul + Overrides: + connectInject: + enabled: true + controller: + enabled: true + + Proceed with installation? (y/N) y + + ==> Running Installation + ✓ Downloaded charts + --> creating 1 resource(s) + --> creating 45 resource(s) + --> beginning wait for 45 resources with timeout of 10m0s + ✓ Consul installed into namespace "consul" + ``` + +1. (Optional) Issue the `consul-k8s status` command to quickly glance at the status of the installed Consul cluster. + + ```shell-session + $ consul-k8s status + + ==> Consul-K8s Status Summary + NAME | NAMESPACE | STATUS | CHARTVERSION | APPVERSION | REVISION | LAST UPDATED + ---------+-----------+----------+--------------+------------+----------+-------------------------- + consul | consul | deployed | 0.40.0 | 1.11.2 | 1 | 2022/01/31 16:58:51 PST + + ==> Config: + connectInject: + enabled: true + controller: + enabled: true + global: + name: consul + + ✓ Consul servers healthy (3/3) + ✓ Consul clients healthy (3/3) + ``` ## Helm Chart Installation @@ -155,8 +175,9 @@ create a `config.yaml` file to override the default settings. You can learn what settings are available by running `helm inspect values hashicorp/consul` or by reading the [Helm Chart Reference](/docs/k8s/helm). -For example, if you want to enable the [Consul Connect](/docs/k8s/connect) feature, -use the following config file: +#### Minimal `config.yaml` for Consul Service Mesh + +The minimal settings to enable [Consul Service Mesh]((/docs/k8s/connect)) would be captured in the following `config.yaml` config file: @@ -179,6 +200,44 @@ NAME: consul ... ``` +#### Enable Consul Service Mesh on select namespaces + +By default, Consul Service Mesh is enabled on almost all namespaces (with the exception of `kube-system` and `local-path-storage`) within a Kubernetes cluster. You can restrict this to a subset of namespaces by specifying a `namespaceSelector` that matches a label attached to each namespace denoting whether to enable Consul service mesh. In order to default to enabling service mesh on select namespaces by label, the `connectInject.default` value must be set to `true`. + + + +```yaml +global: + name: consul +connectInject: + enabled: true + default: true + namespaceSelector: | + matchLabels: + connect-inject : enabled +controller: + enabled: true +``` + + + +Label the namespace(s), where you would like to enable Consul Service Mesh. + +```shell-session +$ kubectl create ns foo +$ kubectl label namespace foo connect-inject=enabled +``` + +Next, run `helm install` with the `--values` flag: + +```shell-session +$ helm install consul hashicorp/consul --create-namespace --namespace consul --values config.yaml +NAME: consul +... +``` + +#### Updating your Consul on Kubernetes configuration + If you've already installed Consul and want to make changes, you'll need to run `helm upgrade`. See [Upgrading](/docs/k8s/upgrade) for more details. diff --git a/website/content/docs/k8s/upgrade/index.mdx b/website/content/docs/k8s/upgrade/index.mdx index 05eaf5bba7..7ce00caf39 100644 --- a/website/content/docs/k8s/upgrade/index.mdx +++ b/website/content/docs/k8s/upgrade/index.mdx @@ -18,12 +18,16 @@ for those changes to take effect. For example, if you've installed Consul with the following: + + ```yaml global: name: consul connectInject: enabled: false ``` + + And you wish to set `connectInject.enabled` to `true`: @@ -35,22 +39,22 @@ connectInject: + enabled: true ``` -Perform the following steps: +To update your deployment configuration using Helm, perform the following steps. 1. Determine your current installed chart version. -```bash -helm list --filter consul -NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION -consul default 2 2020-09-30 ... deployed consul-0.24.0 1.8.2 -``` + ```shell-session + $ helm list --filter consul --namespace consul + NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION + consul consul 2 2022-02-02 21:49:45.647678 -0800 PST deployed consul-0.40.0 1.11.2 + ``` -In this example, version `0.24.0` (from `consul-0.24.0`) is being used. + In this example, version `0.40.0` (from `consul-k8s:0.40.0`) is being used, and Consul on Kubernetes is installed in the `consul` namespace. 1. Perform a `helm upgrade`: ```shell-session - $ helm upgrade consul hashicorp/consul --version 0.24.0 --values /path/to/my/values.yaml + $ helm upgrade consul hashicorp/consul --namespace consul --version 0.40.0 --values /path/to/my/values.yaml ``` **Before performing the upgrade, be sure you've read the other sections on this page, @@ -68,43 +72,43 @@ certain Helm chart version. 1. Update your local Helm repository cache: -```bash -helm repo update -``` - -1. List all available versions: + ```shell-session + $ helm repo update + ``` -```shell-session hideClipboard -$ helm search repo hashicorp/consul --versions -NAME CHART VERSION APP VERSION DESCRIPTION -hashicorp/consul 0.24.1 1.8.2 Official HashiCorp Consul Chart -hashicorp/consul 0.24.0 1.8.1 Official HashiCorp Consul Chart -... -``` +1. List all available versions. Here you can observe that the latest version of `0.40.0`. -Here we can see that the latest version of `0.24.1`. + ```shell-session hideClipboard + $ helm search repo hashicorp/consul --versions + NAME CHART VERSION APP VERSION DESCRIPTION + hashicorp/consul 0.40.0 1.11.2 Official HashiCorp Consul Chart + hashicorp/consul 0.39.0 1.11.1 Official HashiCorp Consul Chart + hashicorp/consul 0.38.0 1.10.4 Official HashiCorp Consul Chart + hashicorp/consul 0.37.0 1.10.4 Official HashiCorp Consul Chart + ... + ``` -1. To determine which version you have installed, issue the following command: + 1. To determine which version you have installed, issue the following command: -```shell-session -$ helm list --filter consul -NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION -consul default 2 2020-09-30 ... deployed consul-0.24.0 1.8.2 -``` + ```shell-session + $ helm list --filter consul --namespace consul + NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION + consul consul 2 2022-02-02 21:49:45.647678 -0800 PST deployed consul-0.39.0 1.11.1 + ``` -In this example, version `0.24.0` (from `consul-0.24.0`) is being used. -If you want to upgrade to the latest `0.24.1` version, use the following procedure: + In this example, version `0.39.0` (from `consul-k8s:0.39.0`) is being used. + If you want to upgrade to the latest `0.40.0` version, use the following procedure: -1. Check the changelog for any breaking changes from that version and any versions in between: https://github.com/hashicorp/consul-helm/blob/master/CHANGELOG.md. +1. Check the changelog for any breaking changes from that version and any versions in between: [CHANGELOG.md](https://github.com/hashicorp/consul-k8s/blob/main/CHANGELOG.md). 1. Upgrade by performing a `helm upgrade` with the `--version` flag: -```shell-session -$ helm upgrade consul hashicorp/consul --version 0.24.1 --values /path/to/my/values.yaml -``` + ```shell-session + $ helm upgrade consul hashicorp/consul --namespace consul --version 0.40.0 --values /path/to/my/values.yaml + ``` -**Before performing the upgrade, be sure you've read the other sections on this page, -continuing at [Determining What Will Change](#determining-what-will-change).** + **Before performing the upgrade, be sure you've read the other sections on this page, + continuing at [Determining What Will Change](#determining-what-will-change).** ### Consul Version Upgrade @@ -123,29 +127,27 @@ to update to the new version. ```yaml global: - image: consul:1.8.3 + image: consul:1.11.2 ``` -1. Determine your current installed chart version: - -```shell-session -$ helm list --filter consul -NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION -consul default 2 2020-09-30 ... deployed consul-0.24.0 1.8.2 -``` +1. Determine your current installed chart version. In this example, version `0.39.0` (from `consul-k8s:0.39.0`) is being used. -In this example, version `0.24.0` (from `consul-0.24.0`) is being used. + ```shell-session + $ helm list --filter consul --namespace consul + NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION + consul consul 2 2022-02-02 21:49:45.647678 -0800 PST deployed consul-0.39.0 1.11.1 + ``` 1. Perform a `helm upgrade`: -```shell-session -$ helm upgrade consul hashicorp/consul --version 0.24.0 --values /path/to/my/values.yaml -``` + ```shell-session + $ helm upgrade consul hashicorp/consul --namespace consul --version 0.39.0 --values /path/to/my/values.yaml + ``` -**Before performing the upgrade, be sure you've read the other sections on this page, -continuing at [Determining What Will Change](#determining-what-will-change).** + **Before performing the upgrade, be sure you have read the other sections on this page, + continuing at [Determining What Will Change](#determining-what-will-change).** ~> NOTE: It's important to always set the `--version` flag, because otherwise Helm will use the most up-to-date version in its local cache, which may result in an @@ -163,36 +165,36 @@ that can be used. 1. Install `helm-diff` with: -```bash -helm plugin install https://github.com/databus23/helm-diff -``` + ```shell-session + $ helm plugin install https://github.com/databus23/helm-diff + ``` 1. If you are updating your `values.yaml` file, do so now. 1. Take the same `helm upgrade` command you were planning to issue but perform `helm diff upgrade` instead of `helm upgrade`: -```shell-session -$ helm diff upgrade consul hashicorp/consul --version 0.24.1 --values /path/to/your/values.yaml -``` + ```shell-session + $ helm diff upgrade consul hashicorp/consul --namespace consul --version 0.40.0 --values /path/to/your/values.yaml + ``` -This will print out the manifests that will be updated and their diffs. + This will print out the manifests that will be updated and their diffs. 1. To see only the objects that will be updated, add `| grep "has changed"`: -```shell-session -$ helm diff upgrade consul hashicorp/consul --version 0.24.1 --values /path/to/your/values.yaml | - grep "has changed" -``` + ```shell-session + $ helm diff upgrade consul hashicorp/consul --namespace consul --version 0.40.0 --values /path/to/your/values.yaml | + grep "has changed" + ``` 1. Take specific note if `consul-client, DaemonSet` or `consul-server, StatefulSet` are listed. This means that your Consul client daemonset or Consul server statefulset (or both) will be redeployed. -If either is being redeployed, we will follow the same pattern for upgrades as -on other platforms: the servers will be redeployed one-by-one, and then the -clients will be redeployed in batches. Read [Upgrading Consul](/docs/upgrading) and then continue -reading below. + If either is being redeployed, we will follow the same pattern for upgrades as + on other platforms: the servers will be redeployed one-by-one, and then the + clients will be redeployed in batches. Read [Upgrading Consul](/docs/upgrading) and then continue + reading below. -If neither the client daemonset nor the server statefulset is being redeployed, -then you can continue with the helm upgrade without any specific sequence to follow. + If neither the client daemonset nor the server statefulset is being redeployed, + then you can continue with the helm upgrade without any specific sequence to follow. ## Service Mesh @@ -249,37 +251,41 @@ To initiate the upgrade: By default there are 3 servers, so you would set this value to `3` 1. Set the `updateStrategy` for clients to `OnDelete` -```yaml -global: - image: 'consul:123.456' -server: - updatePartition: 3 -client: - updateStrategy: | - type: OnDelete -``` - -The `updatePartition` value controls how many instances of the server -cluster are updated. Only instances with an index _greater than_ the -`updatePartition` value are updated (zero-indexed). Therefore, by setting -it equal to replicas, none should update yet. - -The `updateStrategy` controls how Kubernetes rolls out changes to the client daemonset. -By setting it to `OnDelete`, no clients will be restarted until their pods are deleted. -Without this, they would be redeployed alongside the servers because their Docker -image versions have changed. This is not desirable because we want the Consul -servers to be upgraded _before_ the clients. + + + ```yaml + global: + image: 'consul:123.456' + server: + updatePartition: 3 + client: + updateStrategy: | + type: OnDelete + ``` + + + + The `updatePartition` value controls how many instances of the server + cluster are updated. Only instances with an index _greater than_ the + `updatePartition` value are updated (zero-indexed). Therefore, by setting + it equal to replicas, none should update yet. + + The `updateStrategy` controls how Kubernetes rolls out changes to the client daemonset. + By setting it to `OnDelete`, no clients will be restarted until their pods are deleted. + Without this, they would be redeployed alongside the servers because their Docker + image versions have changed. This is not desirable because we want the Consul + servers to be upgraded _before_ the clients. 1. Next, perform the upgrade: -```shell-session -$ helm upgrade consul hashicorp/consul --version --values /path/to/your/values.yaml -``` + ```shell-session + $ helm upgrade consul hashicorp/consul --namespace consul --version --values /path/to/your/values.yaml + ``` -This will not cause the servers to redeploy (although the resource will be updated). If -everything is stable, begin by decreasing the `updatePartition` value by one, -and performing `helm upgrade` again. This will cause the first Consul server -to be stopped and restarted with the new image. + This will not cause the servers to redeploy (although the resource will be updated). If + everything is stable, begin by decreasing the `updatePartition` value by one, + and performing `helm upgrade` again. This will cause the first Consul server + to be stopped and restarted with the new image. 1. Wait until the Consul server cluster is healthy again (30s to a few minutes). This can be confirmed by issuing `consul members` on one of the previous servers, @@ -298,20 +304,20 @@ restarting the clients as outlined in [Service Mesh](#service-mesh). You can either: 1. Manually issue `kubectl delete pod ` for each consul daemonset pod -2. Set the updateStrategy to rolling update with a small number: +1. Set the updateStrategy to rolling update with a small number: -```yaml -client: - updateStrategy: | - rollingUpdate: - maxUnavailable: 2 - type: RollingUpdate -``` + ```yaml + client: + updateStrategy: | + rollingUpdate: + maxUnavailable: 2 + type: RollingUpdate + ``` -Then, run `helm upgrade`. This will upgrade the clients in batches, waiting -until the clients come up healthy before continuing. + Then, run `helm upgrade`. This will upgrade the clients in batches, waiting + until the clients come up healthy before continuing. -3. Cordon and drain each node to ensure there are no connect pods active on it, and then delete the +1. Cordon and drain each node to ensure there are no connect pods active on it, and then delete the consul client pod on that node. -> NOTE: If you are using only the Service Sync functionality, you can perform an upgrade without diff --git a/website/content/docs/nia/compatibility.mdx b/website/content/docs/nia/compatibility.mdx index 9c97b707f3..bdba0a4fbd 100644 --- a/website/content/docs/nia/compatibility.mdx +++ b/website/content/docs/nia/compatibility.mdx @@ -1,35 +1,40 @@ --- layout: docs -page_title: Consul-Terraform-Sync Compatibility +page_title: Consul-Terraform-Sync (CTS) Compatibility description: >- - Consul-Terraform-Sync Compatibility + Consul-Terraform-Sync (CTS) Compatibility --- # Compatibility +The following tables list the Consul-Terraform-Sync (CTS) version compatibility for Consul, Terraform, and Vault. + ## Consul -Below are the supported Consul versions with compatible Consul-Terraform-Sync versions. The latest Consul-Terraform-Sync binary targets supporting the latest patch version of the three most recent Consul minor versions. +Below are CTS versions with supported Consul versions. The latest CTS binary supports the three most recent Consul minor versions, along with their latest patch versions. -| Consul Version | Compatible Consul-Terraform-Sync Version | -| ---------------------------- | ---------------------------------------- | -| 1.8+ | 0.1+ | +| CTS Version | Consul OSS & Enterprise Version | +| :------------------ | :------------------------------ | +| CTS Enterprise 0.3+ | 1.8+ | +| CTS OSS 0.1+ | 1.8+ | ## Terraform -Consul-Terraform-Sync is compatible with the following Terraform OSS versions: +CTS integration with Terraform is supported for the following: -| Consul-Terraform-Sync | Compatible Terraform Version | -| --------------------- | ---------------------------- | -| 0.3+ | 0.13 - 1.1 | -| 0.2 | 0.13 - 1.0 | -| 0.1 | 0.13 - 0.14 | +| CTS Version | Terraform CLI Version | Terraform Cloud Version | Terraform Enterprise Version | +| :------------------ | :-------------------- | :---------------------- | :--------------------------- | +| CTS Enterprise 0.4+ | 0.13 - 1.1 | Latest | v202010-2 - Latest | +| CTS Enterprise 0.3+ | 0.13 - 1.1 | N/A | v202010-2 - Latest | +| CTS OSS 0.3+ | 0.13 - 1.1 | N/A | N/A | +| CTS OSS 0.2 | 0.13 - 1.0 | N/A | N/A | +| CTS OSS 0.1 | 0.13 - 0.14 | N/A | N/A | -## Terraform Cloud +## Vault -Consul-Terraform-Sync integration with Terraform Cloud is supported for the following: +CTS integrates with Vault to query secrets, the integration is supported for the following: -| Consul-Terraform-Sync Enterprise | Terraform Cloud | Version | -| -------------------------------- | -------------------------- | ------------------ | -| 0.4+ | Terraform Cloud | Latest | -| 0.3+ | Terraform Enterprise | v202010-2 - Latest | +| CTS Version | Vault OSS & Enterprise Version | +| :------------------ | :----------------------------- | +| CTS Enterprise 0.3+ | 0.7+ | +| CTS OSS 0.1+ | 0.7+ | diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 181f29dc7a..1acb4ffb06 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -1,11 +1,25 @@ [ { - "title": "Intro to Consul", + "title": "What is Consul?", "routes": [ { "title": "Overview", "path": "intro" }, + { + "title": "Use Cases", + "routes": [ + { + "title": "Overview", + "path": "intro/usecases", + "hidden": true + }, + { + "title": "What is a Service Mesh?", + "path": "intro/usecases/what-is-a-service-mesh" + } + ] + }, { "title": "Consul vs. Other Software", "routes": [ @@ -507,10 +521,6 @@ "title": "Configuring a Connect CA Provider", "path": "k8s/connect/connect-ca-provider" }, - { - "title": "Ambassador Edge Stack Integration", - "href": "https://learn.hashicorp.com/tutorials/consul/load-balancing-ambassador" - }, { "title": "Health Checks", "path": "k8s/connect/health" diff --git a/website/public/img/consul_terraform_sync_intro-consul_ui-services_status.png b/website/public/img/consul_terraform_sync_intro-consul_ui-services_status.png new file mode 100644 index 0000000000..8880c56e89 Binary files /dev/null and b/website/public/img/consul_terraform_sync_intro-consul_ui-services_status.png differ diff --git a/website/public/img/logo-hashicorp.svg b/website/public/img/logo-hashicorp.svg index 3630d56bf0..58ee99fbb7 100644 --- a/website/public/img/logo-hashicorp.svg +++ b/website/public/img/logo-hashicorp.svg @@ -1,7 +1,94 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/website/public/img/logo-text.svg b/website/public/img/logo-text.svg index 6f06a71561..513b3ec4d4 100644 --- a/website/public/img/logo-text.svg +++ b/website/public/img/logo-text.svg @@ -1,8 +1,91 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/website/public/img/what_is_service_mesh_1.png b/website/public/img/what_is_service_mesh_1.png new file mode 100644 index 0000000000..77aa7678ac Binary files /dev/null and b/website/public/img/what_is_service_mesh_1.png differ