Icon Block: Progress

Icon block progress

Set `progress` to a percentage from `0` to `100` in the component context.

The template calculates the first `stroke-dasharray` value as `392 × progress / 100`; the second value stays `392` because the SVG path is 392 units long. Thus `0` renders `0 392` (empty), `34` renders `133.28 392`, and `100` renders `392 392` (full). Values outside `0`–`100` are clamped to that range.

<span class="sds-iconBlock" aria-hidden="true">

    <span class="sds-iconBlock__progress">
        <svg width="100%" height="100%" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
            <path class="sds-iconBlock__progressTrack" d="M50 1 H99 V99 H1 V1 H50 Z" fill="red" stroke-width="2" />
            <path d="M50 1 H99 V99 H1 V1 H50 Z" fill="none" stroke-width="2" stroke-dasharray="133.28 392" stroke-dashoffset="0" />
        </svg>
    </span>

    <span class="sds-iconBlock__text">1</span>

</span>
{% include "@icon-block-frame" %}
  • Content:
    /* variables specific to current element */
    
    $element-specific-variables: "";
    
    .#{$namespace}iconBlock {
    
    	/* Save root element context for easy access if nesting is needed */
    
    	$self: &;
    
    	--sds-icon-block-border-radius: #{map-deep-get($design-tokens, "comp-icon-block-border-radius")};
    	--sds-icon-block-dimensions: #{map-deep-get($design-tokens, "comp-icon-block-width")};
    
    	/* properties of current element  + media queries */
    	position: relative;
    	z-index: z(zero);
    	display: inline-flex;
    	align-items: center;
    	justify-content: center;
    	flex-shrink: 0;
    	width: var(--sds-icon-block-dimensions);
    	height: var(--sds-icon-block-dimensions);
    	@include custom-prop-fallback("background-color","comp-icon-block-primary-muted-background-color");
    	@include custom-prop-fallback("color","comp-icon-block-primary-muted-icon-background-color");
    	border-radius: var(--sds-icon-block-border-radius);
    
    	/* Pseudo Elements */
    
    	&::before {
    	}
    
    	&::after {
    	}
    
    	/*
    	Include elements that are linked to the current element but have to reside at the root level of the stylesheet
    	(e.g: keyframes)
    	*/
    	@at-root {
    	}
    
    
    	/* children - write selector in full in comments in order to facilitate search */
    	
    	svg {
    
    		max-width: 100%;
    
    	}
    
    	&__icon {
    
    		font-size: map-deep-get($design-tokens, "comp-icon-block-icon-size");
    		width: map-deep-get($design-tokens, "comp-icon-block-icon-size");
    		display: flex;
    		align-items: center;
    		justify-content: center;
    
    		svg {
    
    			width: inherit;
    			height: inherit;
    
    		}
    		
    		&::before {
    
    			font-size: inherit !important;
    
    		}
    
    	}
    
    
    
    	&__progress {
    
    		position: absolute;
    		inset: 0;
    
    		svg {
    
    			border-radius: calc(var(--sds-icon-block-border-radius) + var(--sys-border-width-regular));
    
    			path {
    				@include custom-prop-fallback("stroke","ui-interaction-active-border-color");
    
    				stroke-width: 48px;
    
    			}
    
    		}
    
    	}
    
    	&__progressTrack {
    		@include custom-prop-fallback("stroke","brand-color-primary-solid-40","true","true")
    	}
    
    	&__text {
    
    		font-family: $headings-font-family;
    		font-weight: 600;
    
    	}
    
    	&:has(#{$self}__progress) {
    		#{$self}__text {
    			width: calc(var(--sds-icon-block-dimensions) - (var(--sys-border-width-regular) * 2));
    			height: calc(var(--sds-icon-block-dimensions) - (var(--sys-border-width-regular) * 2));
    			background-color: inherit;
    			position: relative;
    			display: flex;
    			align-items: center;
    			justify-content: center;
    			z-index: 1;
    			inset: 0;
    			border-radius: calc(var(--sds-icon-block-border-radius));
    		}
    	}
    
    
    	/* modifiers */
    
    	// iconBlock -iconBlockInverse
    	&.-iconBlockInverse {
    
    		// follows same logic as base element
    
    		@include custom-prop-fallback-override("comp-icon-block-primary-muted-background-color","comp-icon-block-primary-inverse-background-color");
    		@include custom-prop-fallback-override("comp-icon-block-primary-muted-icon-background-color","comp-icon-block-primary-inverse-icon-background-color");
    
    	}
    
    	// iconBlock -iconBlockHighlight
    	&.-iconBlockHighlight {
    		@include custom-prop-fallback-override("comp-icon-block-primary-muted-background-color","comp-icon-block-highlight-muted-background-color");
    		@include custom-prop-fallback-override("comp-icon-block-primary-muted-icon-background-color","comp-icon-block-highlight-muted-icon-background-color");
    	}
    
    	&.-iconBlockSuccessLine {
    		@include custom-prop-fallback-override("comp-icon-block-primary-muted-icon-background-color","comp-icon-block-success-inverse-icon-background-color");
    	}
    
    
    	&.-iconBlockColored {
    
    		/* @TODO change this to colored token that doesn't exist yet*/
    		@include custom-prop-fallback("color","comp-icon-block-mia-icon-background-color","true","true");
    
    	}
    
    	&.-iconBlockXs {
    
    		--sds-icon-block-border-radius: #{map-deep-get($design-tokens, "comp-icon-block-extra-small-border-radius")};
    		--sds-icon-block-dimensions: #{map-deep-get($design-tokens, "comp-icon-block-extra-small-width")};
    
    		#{$self}__icon {
    
    			font-size: map-deep-get($design-tokens, "comp-icon-block-extra-small-icon-size");
    			width: map-deep-get($design-tokens, "comp-icon-block-extra-small-icon-size");
    
    		}
    
    	}
    
    	&.-iconBlockSm {
    
    		--sds-icon-block-border-radius: #{map-deep-get($design-tokens, "comp-icon-block-small-border-radius")};
    		--sds-icon-block-dimensions: #{map-deep-get($design-tokens, "comp-icon-block-small-width")};
    
    		#{$self}__icon {
    
    			font-size: map-deep-get($design-tokens, "comp-icon-block-small-icon-size");
    			width: map-deep-get($design-tokens, "comp-icon-block-small-icon-size");
    
    		}
    
    	}
    
    	&.-iconBlockLg {
    
    		--sds-icon-block-border-radius: #{map-deep-get($design-tokens, "comp-icon-block-large-border-radius")};
    		--sds-icon-block-dimensions: #{map-deep-get($design-tokens, "comp-icon-block-large-width")};
    
    		#{$self}__icon {
    
    			font-size: map-deep-get($design-tokens, "comp-icon-block-large-icon-size");
    			width: map-deep-get($design-tokens, "comp-icon-block-large-icon-size");
    
    		}
    
    	}
    
    	&.-iconBlockXl {
    
    		--sds-icon-block-border-radius: #{map-deep-get($design-tokens, "comp-icon-block-large-border-radius")};
    		--sds-icon-block-dimensions: #{map-deep-get($design-tokens, "comp-icon-block-extra-large-width")};
    
    		#{$self}__icon {
    
    			font-size: map-deep-get($design-tokens, "comp-icon-block-extra-large-icon-size");
    			width: map-deep-get($design-tokens, "comp-icon-block-extra-large-icon-size");
    
    		}
    
    	}
    
    	&.-iconBlock2xl {
    
    		--sds-icon-block-border-radius: #{map-deep-get($design-tokens, "comp-icon-block-large-border-radius")};
    		--sds-icon-block-dimensions: #{map-deep-get($design-tokens, "comp-icon-block-mega-width")};
    
    		#{$self}__icon {
    
    			font-size: map-deep-get($design-tokens, "comp-icon-block-mega-icon-size");
    			width: map-deep-get($design-tokens, "comp-icon-block-mega-icon-size");
    
    		}
    
    	}
    
    	/* random parent element */
    	/* 
    	*
    	*   Syntax : .randomParentElt & {}
    	*
    	*/
    
    	/* Pseudo Classes */
    
    	&:hover {
    		@media (hover: hover) {
    
    		}
    	}
    
    	&:focus {
    	}
    
    	&:active {
    	}
    
    	&:focus,
    	&:active {
    	}
    
    }
  • URL: /components/raw/icon-block/_icon-block.scss
  • Filesystem Path: components/token-based/content/block/icon-block/_icon-block.scss
  • Size: 5.9 KB