src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.ts/GettingStartedPage/updateCategoryProgress
class GettingStartedPage:	private updateCategoryProgress() {
		document.querySelectorAll('.category-progress').forEach(element => {
			const categoryID = element.getAttribute('x-data-category-id');
			const category = this.gettingStartedCategories.find(category => category.id === categoryID);
			if (!category) { throw Error('Could not find category with ID ' + categoryID); }
			if (category.content.type !== 'steps') { throw Error('Category with ID ' + categoryID + ' is not of steps type'); }
			const numDone = category.content.stepsComplete = category.content.steps.filter(step => step.done).length;
			const numTotal = category.content.stepsTotal = category.content.steps.length;

			const bar = assertIsDefined(element.querySelector('.progress-bar-inner')) as HTMLDivElement;
			bar.setAttribute('aria-valuemin', '0');
			bar.setAttribute('aria-valuenow', '' + numDone);
			bar.setAttribute('aria-valuemax', '' + numTotal);
			const progress = (numDone / numTotal) * 100;
			bar.style.width = `${progress}%`;


			(element.parentElement as HTMLElement).classList[numDone === 0 ? 'add' : 'remove']('no-progress');

			if (numTotal === numDone) {
				bar.title = localize('gettingStarted.allStepsComplete', "All {0} steps complete!", numTotal);
			}
			else {
				bar.title = localize('gettingStarted.someStepsComplete', "{0} of {1} steps complete", numDone, numTotal);
			}
		});
	}