diff --git a/dist/shoelace.css b/dist/shoelace.css
index 89ef624d..8b0f13ff 100644
--- a/dist/shoelace.css
+++ b/dist/shoelace.css
@@ -8,7 +8,7 @@
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}
-/*! Variables */:root{--font-sans-serif:sans-serif;--font-serif:serif;--font-system:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;--font-monospace:Menlo,Consolas,"DejaVu Sans Mono",monospace;--color-primary:tomato;--color-white:#fff;--color-navy:#001f3f;--color-blue:#0074d9;--color-aqua:#7fdbff;--color-teal:#39cccc;--color-olive:#3d9970;--color-green:#2ecc40;--color-lime:#01ff70;--color-yellow:#ffdc00;--color-orange:#ff851b;--color-red:#ff4136;--color-maroon:#85144b;--color-fuchsia:#f012be;--color-purple:#b10dc9;--color-black:#111;--color-gray:#aaa;--color-silver:#ddd;--state-success:var(--color-green);--state-info:var(--color-aqua);--state-warning:var(--color-orange);--state-danger:var(--color-red);--state-inverse:var(--color-black);--component-bg-color:#f2f2f2;--component-border-color:#ddd;--component-border-radius:.25rem;--component-border-width:1px;--component-spacing:1rem;--component-spacing-big:2rem;--component-spacing-small:.5rem;--body-bg-color:var(--color-white);--body-color:var(--color-black);--font-family:var(--font-system);--font-size:1rem;--font-size-big:1.25rem;--font-size-small:.875rem;--font-weight-light:300;--font-weight:400;--font-weight-bold:700;--line-height:1.5;--text-muted:var(--color-gray);--code-font-size:90%;--code-color:var(--color-black);--code-border-radius:var(--component-border-radius);--code-bg-color:var(--component-bg-color);--code-spacing-x:calc(var(--font-size) * .4);--code-spacing-y:calc(var(--font-size) * .2);--headings-font-family:var(--font-system);--headings-font-weight:var(--font-weight-light);--headings-line-height:1.1;--headings-margin-bottom:.5rem;--headings-color:inherit;--headings-font-size-h1:2.5rem;--headings-font-size-h2:2rem;--headings-font-size-h3:1.75rem;--headings-font-size-h4:1.5rem;--headings-font-size-h5:1.25rem;--headings-font-size-h6:1rem;--hr-border-width:1px;--hr-border-color:var(--component-border-color);--hr-spacing:var(--component-spacing-big);--kbd-font-size:90%;--kbd-color:var(--color-white);--kbd-border-radius:var(--component-border-radius);--kbd-bg-color:var(--color-black);--kbd-spacing-x:calc(var(--font-size) * .4);--kbd-spacing-y:calc(var(--font-size) * .2);--link-color:var(--color-primary);--link-text-decoration:none;--link-color-hover:var(--link-color);--link-text-decoration-hover:underline;--mark-color:inherit;--mark-bg-color:var(--color-yellow);--mark-spacing-x:calc(var(--font-size) * .4);--mark-spacing-y:calc(var(--font-size) * .2);--placeholder-color:var(--text-muted);--pre-color:var(--code-color);--pre-border-radius:var(--component-border-radius);--pre-bg-color:var(--code-bg-color);--pre-max-height:none;--selection-color:var(--color-white);--selection-bg-color:var(--color-primary);--alert-color:var(--color-white);--alert-border-radius:var(--component-border-radius);--alert-bg-color-primary:var(--color-primary);--alert-bg-color-success:var(--state-success);--alert-bg-color-info:var(--state-info);--alert-bg-color-warning:var(--state-warning);--alert-bg-color-danger:var(--state-danger);--alert-bg-color-inverse:var(--state-inverse);--alert-spacing-x:var(--component-spacing);--alert-spacing-y:var(--component-spacing);--badge-font-size:.8em;--badge-font-weight:var(--font-weight);--badge-color:var(--color-white);--badge-border-radius:1em;--badge-bg-color-primary:var(--color-primary);--badge-bg-color-success:var(--state-success);--badge-bg-color-info:var(--state-info);--badge-bg-color-warning:var(--state-warning);--badge-bg-color-danger:var(--state-danger);--badge-bg-color-inverse:var(--state-inverse);--badge-spacing-x:calc(var(--component-spacing) * .5);--badge-spacing-y:calc(var(--component-spacing) * .15);--button-font-family:inherit;--button-font-weight:inherit;--button-font-size:var(--font-size);--button-color:var(--color-white);--button-border-radius:var(--component-border-radius);--button-box-shadow:inset 0 2px 0 hsla(0,0%,100%,.1),inset 0 -2px 0 rgba(0,0,0,.1);--button-box-shadow-hover:inset 0 2px 5rem rgba(0,0,0,.1),inset 0 -2px 0 rgba(0,0,0,.1);--button-box-shadow-active:inset 0 2px 5rem rgba(0,0,0,.1),inset 0 2px 0 rgba(0,0,0,.1);--button-bg-color-primary:var(--color-primary);--button-bg-color-success:var(--state-success);--button-bg-color-info:var(--state-info);--button-bg-color-warning:var(--state-warning);--button-bg-color-danger:var(--state-danger);--button-bg-color-inverse:var(--state-inverse);--dropdown-min-width:10rem;--dropdown-max-width:25rem;--dropdown-max-height:none;--dropdown-offset-x:0;--dropdown-offset-y:1px;--dropdown-border-color:var(--component-border-color);--dropdown-border-radius:var(--component-border-radius);--dropdown-border-width:var(--component-border-width);--dropdown-color:var(--body-color);--dropdown-color-hover:var(--color-white);--dropdown-bg-color:var(--color-white);--dropdown-bg-color-hover:var(--color-primary);--dropdown-box-shadow:0 1px 0 rgba(0,0,0,.05);--dropdown-divider-border-color:var(--component-border-color);--dropdown-divider-border-width:var(--component-border-width);--dropdown-spacing-x:var(--component-spacing);--dropdown-spacing-y:calc(var(--dropdown-spacing-x) / 4);--dropdown-z-index:100;--fieldset-border-color:var(--component-border-color);--fieldset-border-width:var(--component-border-width);--fieldset-border-radius:var(--component-border-radius);--fieldset-spacing-x:var(--component-spacing);--fieldset-spacing-y:var(--component-spacing);--input-font-family:inherit;--input-font-size:var(--font-size);--input-font-size-small:.8rem;--input-font-size-big:1.2rem;--input-font-weight:inherit;--input-height:2rem;--input-height-big:2.75rem;--input-height-small:1.25rem;--input-color:var(--body-color);--input-border-color:var(--component-border-color);--input-border-color-focus:var(--color-primary);--input-border-width:1px;--input-border-radius:var(--component-border-radius);--input-bg-color:var(--color-white);--input-box-shadow:inset 0 1px 0 rgba(0,0,0,.05);--input-readonly-bg-color:var(--component-bg-color);--input-range-track-color:var(--component-bg-color);--input-range-track-box-shadow:inset 0 1px 0 rgba(0,0,0,.05);--input-range-thumb-color:var(--color-primary);--input-range-thumb-height:2rem;--input-invalid-color:var(--state-danger);--input-invalid-border-color:var(--state-danger);--input-valid-color:var(--state-success);--input-valid-border-color:var(--state-success);--loader-bg-color:var(--component-bg-color);--loader-border-color:var(--color-primary);--loader-border-width:.25rem;--loader-size:2rem;--loader-speed:750ms;--loader-spacing-x:var(--component-spacing-small);--loader-spacing-y:0;--spacing-small:var(--component-spacing);--spacing-medium:calc(var(--component-spacing) * 2);--spacing-big:calc(var(--component-spacing) * 4);--switch-font-size:var(--input-font-size);--switch-font-size-small:var(--input-font-size-small);--switch-font-size-big:var(--input-font-size-big);--switch-bg-color:var(--component-border-color);--switch-bg-color-checked:var(--color-primary);--switch-border-radius:var(--switch-size);--switch-size:2rem;--switch-size-small:1rem;--switch-size-big:3rem;--switch-thumb-bg-color:#fff;--switch-thumb-border-radius:50%;--switch-thumb-spacing:2px;--switch-speed:.2s;--tab-bg-color:var(--body-bg);--tab-bg-color-hover:var(--body-bg);--tab-bg-color-active:var(--link-color);--tab-bg-color-disabled:var(--body-bg);--tab-border-radius:var(--component-border-radius);--tab-color:var(--link-color);--tab-color-hover:var(--link-color-hover);--tab-color-active:var(--color-white);--tab-color-disabled:var(--text-muted);--tab-spacing-x:var(--component-spacing);--tab-spacing-y:calc(var(--component-spacing) / 2);--tab-pane-border-color:var(--component-border-color);--tab-pane-border-radius:var(--component-border-radius);--tab-pane-border-width:var(--component-border-width);--tab-pane-spacing-x:var(--component-spacing);--tab-pane-spacing-y:var(--component-spacing);--table-border-color:var(--component-border-color);--table-border-width:var(--component-border-width);--table-header-bg-color:transparent;--table-stripe-bg-color:var(--component-bg-color);--table-hover-color:var(--color-white);--table-hover-bg-color:var(--color-primary);--table-spacing-x:calc(var(--component-spacing-small) * 1.5);--table-spacing-y:var(--component-spacing-small)}
+/*! Variables */:root{--font-sans-serif:sans-serif;--font-serif:serif;--font-system:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;--font-monospace:Menlo,Consolas,"DejaVu Sans Mono",monospace;--color-primary:tomato;--color-white:#fff;--color-navy:#001f3f;--color-blue:#0074d9;--color-aqua:#7fdbff;--color-teal:#39cccc;--color-olive:#3d9970;--color-green:#2ecc40;--color-lime:#01ff70;--color-yellow:#ffdc00;--color-orange:#ff851b;--color-red:#ff4136;--color-maroon:#85144b;--color-fuchsia:#f012be;--color-purple:#b10dc9;--color-black:#111;--color-gray:#aaa;--color-silver:#ddd;--state-success:var(--color-green);--state-info:var(--color-aqua);--state-warning:var(--color-orange);--state-danger:var(--color-red);--state-inverse:var(--color-black);--component-bg-color:#f2f2f2;--component-border-color:#ddd;--component-border-radius:.25rem;--component-border-width:1px;--component-spacing:1rem;--component-spacing-big:2rem;--component-spacing-small:.5rem;--body-bg-color:var(--color-white);--body-color:var(--color-black);--font-family:var(--font-system);--font-size:1rem;--font-size-big:1.25rem;--font-size-small:.875rem;--font-weight-light:300;--font-weight:400;--font-weight-bold:700;--line-height:1.5;--text-muted:var(--color-gray);--code-font-size:90%;--code-color:var(--color-black);--code-border-radius:var(--component-border-radius);--code-bg-color:var(--component-bg-color);--code-spacing-x:calc(var(--font-size) * .4);--code-spacing-y:calc(var(--font-size) * .2);--headings-font-family:var(--font-system);--headings-font-weight:var(--font-weight-light);--headings-line-height:1.1;--headings-margin-bottom:.5rem;--headings-color:inherit;--headings-font-size-h1:2.5rem;--headings-font-size-h2:2rem;--headings-font-size-h3:1.75rem;--headings-font-size-h4:1.5rem;--headings-font-size-h5:1.25rem;--headings-font-size-h6:1rem;--hr-border-width:1px;--hr-border-color:var(--component-border-color);--hr-spacing:var(--component-spacing-big);--kbd-font-size:90%;--kbd-color:var(--color-white);--kbd-border-radius:var(--component-border-radius);--kbd-bg-color:var(--color-black);--kbd-spacing-x:calc(var(--font-size) * .4);--kbd-spacing-y:calc(var(--font-size) * .2);--link-color:var(--color-primary);--link-text-decoration:none;--link-color-hover:var(--link-color);--link-text-decoration-hover:underline;--mark-color:inherit;--mark-bg-color:var(--color-yellow);--mark-spacing-x:calc(var(--font-size) * .4);--mark-spacing-y:calc(var(--font-size) * .2);--placeholder-color:var(--text-muted);--pre-color:var(--code-color);--pre-border-radius:var(--component-border-radius);--pre-bg-color:var(--code-bg-color);--pre-max-height:none;--selection-color:var(--color-white);--selection-bg-color:var(--color-primary);--alert-color:var(--color-white);--alert-border-radius:var(--component-border-radius);--alert-bg-color-primary:var(--color-primary);--alert-bg-color-success:var(--state-success);--alert-bg-color-info:var(--state-info);--alert-bg-color-warning:var(--state-warning);--alert-bg-color-danger:var(--state-danger);--alert-bg-color-inverse:var(--state-inverse);--alert-spacing-x:var(--component-spacing);--alert-spacing-y:var(--component-spacing);--badge-font-size:.8em;--badge-font-weight:var(--font-weight);--badge-color:var(--color-white);--badge-border-radius:1em;--badge-bg-color-primary:var(--color-primary);--badge-bg-color-success:var(--state-success);--badge-bg-color-info:var(--state-info);--badge-bg-color-warning:var(--state-warning);--badge-bg-color-danger:var(--state-danger);--badge-bg-color-inverse:var(--state-inverse);--badge-spacing-x:calc(var(--component-spacing) * .5);--badge-spacing-y:calc(var(--component-spacing) * .15);--button-font-family:inherit;--button-font-weight:inherit;--button-font-size:var(--font-size);--button-color:var(--color-white);--button-border-radius:var(--component-border-radius);--button-box-shadow:inset 0 2px 0 hsla(0,0%,100%,.1),inset 0 -2px 0 rgba(0,0,0,.1);--button-box-shadow-hover:inset 0 2px 5rem rgba(0,0,0,.1),inset 0 -2px 0 rgba(0,0,0,.1);--button-box-shadow-active:inset 0 2px 5rem rgba(0,0,0,.1),inset 0 2px 0 rgba(0,0,0,.1);--button-bg-color-primary:var(--color-primary);--button-bg-color-success:var(--state-success);--button-bg-color-info:var(--state-info);--button-bg-color-warning:var(--state-warning);--button-bg-color-danger:var(--state-danger);--button-bg-color-inverse:var(--state-inverse);--dropdown-min-width:10rem;--dropdown-max-width:25rem;--dropdown-max-height:none;--dropdown-offset-x:0;--dropdown-offset-y:1px;--dropdown-border-color:var(--component-border-color);--dropdown-border-radius:var(--component-border-radius);--dropdown-border-width:var(--component-border-width);--dropdown-color:var(--body-color);--dropdown-color-hover:var(--color-white);--dropdown-bg-color:var(--color-white);--dropdown-bg-color-hover:var(--color-primary);--dropdown-box-shadow:0 1px 0 rgba(0,0,0,.05);--dropdown-divider-border-color:var(--component-border-color);--dropdown-divider-border-width:var(--component-border-width);--dropdown-spacing-x:var(--component-spacing);--dropdown-spacing-y:calc(var(--dropdown-spacing-x) / 4);--dropdown-z-index:100;--fieldset-border-color:var(--component-border-color);--fieldset-border-width:var(--component-border-width);--fieldset-border-radius:var(--component-border-radius);--fieldset-spacing-x:var(--component-spacing);--fieldset-spacing-y:var(--component-spacing);--input-font-family:inherit;--input-font-size:var(--font-size);--input-font-size-small:.8rem;--input-font-size-big:1.2rem;--input-font-weight:inherit;--input-height:2rem;--input-height-big:2.75rem;--input-height-small:1.25rem;--input-color:var(--body-color);--input-border-color:var(--component-border-color);--input-border-color-focus:var(--color-primary);--input-border-width:1px;--input-border-radius:var(--component-border-radius);--input-bg-color:var(--color-white);--input-box-shadow:inset 0 1px 0 rgba(0,0,0,.05);--input-readonly-bg-color:var(--component-bg-color);--input-range-track-color:var(--component-bg-color);--input-range-track-box-shadow:inset 0 1px 0 rgba(0,0,0,.05);--input-range-thumb-color:var(--color-primary);--input-range-thumb-height:2rem;--input-invalid-color:var(--state-danger);--input-invalid-border-color:var(--state-danger);--input-valid-color:var(--state-success);--input-valid-border-color:var(--state-success);--loader-bg-color:var(--component-bg-color);--loader-border-color:var(--color-primary);--loader-border-width:.25rem;--loader-size:2rem;--loader-speed:750ms;--loader-spacing-x:var(--component-spacing-small);--loader-spacing-y:0;--progress-font-size:var(--input-font-size);--progress-font-size-small:var(--input-font-size-small);--progress-font-size-big:var(--input-font-size-big);--progress-height:var(--input-height);--progress-height-small:var(--input-height-small);--progress-height-big:var(--input-height-big);--progress-color:var(--color-white);--progress-bg-color:var(--component-bg-color);--progress-bar-bg-color:var(--color-primary);--progress-border-radius:var(--component-border-radius);--progress-speed-change:.2s;--progress-speed-indeterminate:1.5s;--spacing-small:var(--component-spacing);--spacing-medium:calc(var(--component-spacing) * 2);--spacing-big:calc(var(--component-spacing) * 4);--switch-font-size:var(--input-font-size);--switch-font-size-small:var(--input-font-size-small);--switch-font-size-big:var(--input-font-size-big);--switch-bg-color:var(--component-border-color);--switch-bg-color-checked:var(--color-primary);--switch-border-radius:var(--switch-size);--switch-size:2rem;--switch-size-small:1rem;--switch-size-big:3rem;--switch-thumb-bg-color:#fff;--switch-thumb-border-radius:50%;--switch-thumb-spacing:2px;--switch-speed:.2s;--tab-bg-color:var(--body-bg-color);--tab-bg-color-hover:var(--body-bg-color);--tab-bg-color-active:var(--link-color);--tab-bg-color-disabled:var(--body-bg-color);--tab-border-radius:var(--component-border-radius);--tab-color:var(--link-color);--tab-color-hover:var(--link-color-hover);--tab-color-active:var(--color-white);--tab-color-disabled:var(--text-muted);--tab-spacing-x:var(--component-spacing);--tab-spacing-y:calc(var(--component-spacing) / 2);--tab-pane-border-color:var(--component-border-color);--tab-pane-border-radius:var(--component-border-radius);--tab-pane-border-width:var(--component-border-width);--tab-pane-spacing-x:var(--component-spacing);--tab-pane-spacing-y:var(--component-spacing);--table-border-color:var(--component-border-color);--table-border-width:var(--component-border-width);--table-header-bg-color:transparent;--table-stripe-bg-color:var(--component-bg-color);--table-hover-color:var(--color-white);--table-hover-bg-color:var(--color-primary);--table-spacing-x:calc(var(--component-spacing-small) * 1.5);--table-spacing-y:var(--component-spacing-small)}
/*! Content */html{-webkit-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}body{background:var(--body-bg-color);font-family:var(--font-family);font-weight:var(--font-weight);font-size:var(--font-size);color:var(--body-color);line-height:var(--line-height)}a{color:var(--link-color);-webkit-text-decoration:var(--link-text-decoration);text-decoration:var(--link-text-decoration)}a:hover{color:var(--link-color-hover);-webkit-text-decoration:var(--link-text-decoration-hover);text-decoration:var(--link-text-decoration-hover)}abbr[title]{text-decoration:none;border-bottom:2px dashed currentcolor}b,strong{font-weight:var(--font-weight-bold)}blockquote{font-size:var(--font-size-big);border-left:solid .4rem var(--component-border-color);padding:.5rem .5rem .5rem 1rem;margin-bottom:1rem;margin-left:0}blockquote :last-child{margin-bottom:0}code{font-family:var(--font-monospace);font-size:var(--code-font-size);color:var(--code-color);background-color:var(--code-bg-color);border-radius:var(--code-border-radius);padding:var(--code-spacing-y) var(--code-spacing-x)}del{color:var(--color-red)}figure{margin-top:0;margin-bottom:1rem}h1,h2,h3,h4,h5,h6{font-family:var(--headings-font-family);font-weight:var(--headings-font-weight);line-height:var(--headings-line-height);color:var(--headings-color);margin-top:0;margin-bottom:var(--headings-margin-bottom)}h1{font-size:var(--headings-font-size-h1)}h2{font-size:var(--headings-font-size-h2)}h3{font-size:var(--headings-font-size-h3)}h4{font-size:var(--headings-font-size-h4)}h5{font-size:var(--headings-font-size-h5)}h6{font-size:var(--headings-font-size-h6)}hr{border:none;border-top:solid var(--hr-border-width) var(--hr-border-color);margin:var(--hr-spacing) 0}img{height:auto;max-width:100%;vertical-align:middle}ins{color:var(--color-green)}kbd{font-family:var(--font-monospace);font-size:var(--kbd-font-size);color:var(--kbd-color);background-color:var(--kbd-bg-color);border-radius:var(--kbd-border-radius);padding:var(--kbd-spacing-y) var(--kbd-spacing-x)}mark{color:var(--mark-color);background-color:var(--mark-bg-color);padding:var(--mark-spacing-y) var(--mark-spacing-x)}p,pre{margin-top:0;margin-bottom:1rem}pre{max-height:var(--pre-max-height);overflow-y:auto;font-family:var(--font-monospace);color:var(--pre-color);background-color:var(--pre-bg-color);border-radius:var(--pre-border-radius);padding:1rem}small{font-size:var(--font-size-small)}dl{margin-bottom:1rem}dt{font-weight:var(--font-weight-bold)}dd{margin-left:0}dd,ol,ul{margin-bottom:1rem}ol,ul{line-height:var(--line-height);margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}::-webkit-input-placeholder{color:var(--placeholder-color)}:-ms-input-placeholder{color:var(--placeholder-color)}::placeholder{color:var(--placeholder-color)}::-moz-selection{background-color:var(--selection-bg-color);color:var(--selection-color);text-shadow:none!important}::selection{background-color:var(--selection-bg-color);color:var(--selection-color);text-shadow:none!important}
@@ -24,6 +24,8 @@
/*! Loaders */@-webkit-keyframes loader{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loader{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.loader,.loader-bg:after{width:var(--loader-size);height:var(--loader-size);border-radius:50%;border:solid var(--loader-border-width) var(--loader-bg-color);border-top-color:var(--loader-border-color);border-left-color:var(--loader-border-color);display:inline-block;-webkit-animation:loader var(--loader-speed) linear infinite;animation:loader var(--loader-speed) linear infinite;vertical-align:middle;margin:var(--loader-spacing-y) var(--loader-spacing-x)}.loader-bg-small:after,.loader-small{border-width:calc(var(--loader-border-width) / 2);width:calc(var(--loader-size) / 2);height:calc(var(--loader-size) / 2)}.loader-bg-big:after,.loader-big{border-width:calc(var(--loader-border-width) * 1.5);width:calc(var(--loader-size) * 2);height:calc(var(--loader-size) * 2)}.loader-bg{position:relative!important}.loader-bg:after{content:"";position:absolute;top:calc(50% - var(--loader-size) / 2);left:calc(50% - var(--loader-size) / 2);margin:0}.loader-bg-small:after{position:absolute;top:calc(50% - var(--loader-size) / 4);left:calc(50% - var(--loader-size) / 4)}.loader-bg-big:after{position:absolute;top:calc(50% - var(--loader-size) / 1);left:calc(50% - var(--loader-size) / 1)}
+/*! Progress Bars */@-webkit-keyframes progress-indeterminate{0%{left:-50%}to{left:100%}}@keyframes progress-indeterminate{0%{left:-50%}to{left:100%}}.progress{position:relative;width:100%;height:var(--progress-height);background-color:var(--progress-bg-color);border-radius:var(--progress-border-radius);display:block;overflow:hidden;margin-bottom:1rem}.progress-bar{position:absolute;top:0;left:0;width:0;height:100%;font-size:var(--progress-font-size);line-height:var(--progress-height);text-align:center;color:var(--progress-color);background-color:var(--progress-bar-bg-color);-webkit-transition:var(--progress-speed-change) width;transition:var(--progress-speed-change) width;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.progress-small{height:var(--progress-height-small)}.progress-small .progress-bar{line-height:var(--progress-height-small);font-size:var(--progress-font-size-small)}.progress-big,.progress-big .progress-bar{height:var(--progress-height-big)}.progress-big .progress-bar{line-height:var(--progress-height-big);font-size:var(--progress-font-size-big)}.progress-indeterminate .progress-bar{width:50%!important;-webkit-animation:progress-indeterminate linear var(--progress-speed-indeterminate) infinite;animation:progress-indeterminate linear var(--progress-speed-indeterminate) infinite}
+
/*! Switches */.switch{font-size:var(--switch-font-size)}.switch-small{font-size:var(--switch-font-size-small);--switch-size:var(--switch-size-small)}.switch-big{font-size:var(--switch-font-size-big);--switch-size:var(--switch-size-big)}.switch input{display:none}.switch input+label{position:relative;min-width:calc(var(--switch-size) * 2);height:var(--switch-size);line-height:var(--switch-size);display:inline-block;cursor:pointer;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;text-indent:calc(var(--switch-size) * 2 + .5rem)}.switch input+label:after,.switch input+label:before{content:"";position:absolute;top:0;left:0;width:calc(var(--switch-size) * 2);bottom:0;display:block}.switch input+label:before{right:0;background-color:var(--switch-bg-color);border-radius:var(--switch-border-radius);-webkit-transition:background-color var(--switch-speed);transition:background-color var(--switch-speed)}.switch input+label:after{top:var(--switch-thumb-spacing);left:var(--switch-thumb-spacing);width:calc(var(--switch-size) - var(--switch-thumb-spacing) * 2);height:calc(var(--switch-size) - var(--switch-thumb-spacing) * 2);border-radius:var(--switch-thumb-border-radius);background-color:var(--switch-thumb-bg-color);-webkit-transition:margin var(--switch-speed);transition:margin var(--switch-speed)}.switch input:checked+label:before{background-color:var(--switch-bg-color-checked)}.switch input:checked+label:after{margin-left:var(--switch-size)}.switch input:disabled+label{opacity:.5;cursor:not-allowed}.switch+.switch{margin-left:1rem}
/*! Tabs */.tabs{width:100%}.tabs,.tabs-nav{margin-bottom:1rem}.tabs-nav{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tabs-nav a{color:var(--tab-color);text-decoration:none;background-color:var(--tab-bg-color);border-radius:var(--tab-border-radius);padding:var(--tab-spacing-y) var(--tab-spacing-x);display:inline-block}.tabs-nav a:hover{color:var(--tab-color-hover);background-color:var(--tab-bg-color-hover);text-decoration:none}.tabs-nav a.active{color:var(--tab-color-active);background-color:var(--tab-bg-color-active);cursor:default}.tabs-nav a.disabled{color:var(--tab-color-disabled);background-color:var(--tab-bg-color-disabled);cursor:not-allowed}.tabs-pane{border:solid var(--tab-pane-border-width) var(--tab-pane-border-color);border-radius:.25rem;padding:var(--tab-pane-spacing-y) var(--tab-pane-spacing-x)}.tabs-pane:not(.active){display:none}.tabs-pane :last-child{margin-bottom:0}
diff --git a/docs/alerts.html b/docs/alerts.html
index 906257db..4d3265b4 100644
--- a/docs/alerts.html
+++ b/docs/alerts.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/attribution.html b/docs/attribution.html
index d05e0b2c..efa404ed 100644
--- a/docs/attribution.html
+++ b/docs/attribution.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/badges.html b/docs/badges.html
index 10542a39..c03244af 100644
--- a/docs/badges.html
+++ b/docs/badges.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/browser-support.html b/docs/browser-support.html
index 6f64647b..e2d3590a 100644
--- a/docs/browser-support.html
+++ b/docs/browser-support.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/buttons.html b/docs/buttons.html
index ea1010eb..d1f3f076 100644
--- a/docs/buttons.html
+++ b/docs/buttons.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/content.html b/docs/content.html
index 0c73fa04..fefe8014 100644
--- a/docs/content.html
+++ b/docs/content.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/customizing.html b/docs/customizing.html
index 8ca82412..1e1af205 100644
--- a/docs/customizing.html
+++ b/docs/customizing.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/dropdowns.html b/docs/dropdowns.html
index fbc494f1..7d2b0273 100644
--- a/docs/dropdowns.html
+++ b/docs/dropdowns.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/forms.html b/docs/forms.html
index fc942a6e..89bcb63c 100644
--- a/docs/forms.html
+++ b/docs/forms.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
@@ -120,10 +121,6 @@
<input type="time">
-
- <progress></progress>
-
-
<select>
diff --git a/docs/grid-system.html b/docs/grid-system.html
index d15e1493..244c7f95 100644
--- a/docs/grid-system.html
+++ b/docs/grid-system.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/icons.html b/docs/icons.html
index 22fee13d..64efbf19 100644
--- a/docs/icons.html
+++ b/docs/icons.html
@@ -36,6 +36,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/installing.html b/docs/installing.html
index 91a7c7a8..6651a697 100644
--- a/docs/installing.html
+++ b/docs/installing.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/loaders.html b/docs/loaders.html
index 58e1f333..82e19edc 100644
--- a/docs/loaders.html
+++ b/docs/loaders.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/progress-bars.html b/docs/progress-bars.html
new file mode 100644
index 00000000..60703cc8
--- /dev/null
+++ b/docs/progress-bars.html
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+ Progress Bars
+
+
+
+
+
+
+ A back to the basics CSS starter kit. For when you don’t need the whole boot.
+
+
+
+
+
+ Installing
+ Customizing
+ Content
+ Alerts
+ Badges
+ Buttons
+ Dropdowns
+ Forms
+ Loaders
+ Progress Bars
+ Switches
+ Tabs
+ Tables
+ Utilities
+ Grid System
+ Icons
+ Browser Support
+ Attribution
+
+
+
+
Progress Bars
+
HTML5 introduced the <progress> element, but it’s not currently possible to style consistently in all browsers. As a result, Shoelace offers a custom alternative.
+
Create a progress bar with the following markup. Use the progress-small and progress-big modifiers to change the size. To set the state, use a sizing utility or set the width explicitly on the progress-bar element.
+
An optional text label can be included inside the progress-bar element.
+
<div class="progress progress-small">
+ <div class="progress-bar width-25">25%</div>
+</div>
+
+<div class="progress">
+ <div class="progress-bar width-50">50%</div>
+</div>
+
+<div class="progress progress-big">
+ <div class="progress-bar width-75">75%</div>
+</div>
+
+
+
+
+
+
+
+
When progress can’t be determined, use the progress-indeterminate modifier to set an indeterminate state.
+
<div class="progress progress-indeterminate">
+ <div class="progress-bar"></div>
+</div>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/switches.html b/docs/switches.html
index d2f1caec..1802ca57 100644
--- a/docs/switches.html
+++ b/docs/switches.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/tables.html b/docs/tables.html
index f7bf110e..0876e6d3 100644
--- a/docs/tables.html
+++ b/docs/tables.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/tabs.html b/docs/tabs.html
index 8d5b3ca8..dddd37a0 100644
--- a/docs/tabs.html
+++ b/docs/tabs.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/docs/utilities.html b/docs/utilities.html
index 12d78d06..6f8ed50a 100644
--- a/docs/utilities.html
+++ b/docs/utilities.html
@@ -35,6 +35,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables
diff --git a/source/css/progress-bars.css b/source/css/progress-bars.css
new file mode 100644
index 00000000..0911bfb6
--- /dev/null
+++ b/source/css/progress-bars.css
@@ -0,0 +1,62 @@
+/*! Progress Bars */
+
+@keyframes progress-indeterminate {
+ 0% {
+ left: -50%;
+ }
+
+ 100% {
+ left: 100%;
+ }
+}
+
+.progress {
+ position: relative;
+ width: 100%;
+ height: var(--progress-height);
+ background-color: var(--progress-bg-color);
+ border-radius: var(--progress-border-radius);
+ display: block;
+ overflow: hidden;
+ margin-bottom: 1rem;
+}
+
+.progress-bar {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 0;
+ height: 100%;
+ font-size: var(--progress-font-size);
+ line-height: var(--progress-height);
+ text-align: center;
+ color: var(--progress-color);
+ background-color: var(--progress-bar-bg-color);
+ transition: var(--progress-speed-change) width;
+ user-select: none;
+ cursor: default;
+}
+
+.progress-small {
+ height: var(--progress-height-small);
+}
+
+.progress-small .progress-bar {
+ line-height: var(--progress-height-small);
+ font-size: var(--progress-font-size-small);
+}
+
+.progress-big {
+ height: var(--progress-height-big);
+}
+
+.progress-big .progress-bar {
+ height: var(--progress-height-big);
+ line-height: var(--progress-height-big);
+ font-size: var(--progress-font-size-big);
+}
+
+.progress-indeterminate .progress-bar {
+ width: 50% !important;
+ animation: progress-indeterminate linear var(--progress-speed-indeterminate) infinite;
+}
diff --git a/source/css/shoelace.css b/source/css/shoelace.css
index 4b96bd6d..57f69140 100644
--- a/source/css/shoelace.css
+++ b/source/css/shoelace.css
@@ -20,6 +20,7 @@
@import url('dropdowns.css');
@import url('forms.css');
@import url('loaders.css');
+@import url('progress-bars.css');
@import url('switches.css');
@import url('tabs.css');
@import url('tables.css');
diff --git a/source/css/variables.css b/source/css/variables.css
index 2321b33f..791eb193 100644
--- a/source/css/variables.css
+++ b/source/css/variables.css
@@ -210,6 +210,20 @@
--loader-spacing-x: var(--component-spacing-small);
--loader-spacing-y: 0;
+ /* Progress */
+ --progress-font-size: var(--input-font-size);
+ --progress-font-size-small: var(--input-font-size-small);
+ --progress-font-size-big: var(--input-font-size-big);
+ --progress-height: var(--input-height);
+ --progress-height-small: var(--input-height-small);
+ --progress-height-big: var(--input-height-big);
+ --progress-color: var(--color-white);
+ --progress-bg-color: var(--component-bg-color);
+ --progress-bar-bg-color: var(--color-primary);
+ --progress-border-radius: var(--component-border-radius);
+ --progress-speed-change: .2s;
+ --progress-speed-indeterminate: 1.5s;
+
/* Spacing Utilties */
--spacing-small: var(--component-spacing);
--spacing-medium: calc(var(--component-spacing) * 2);
diff --git a/source/docs/forms.md b/source/docs/forms.md
index d0f25a6b..68ee0d78 100644
--- a/source/docs/forms.md
+++ b/source/docs/forms.md
@@ -82,10 +82,6 @@ Form controls are styled at 100% of the width of their parent element.
<input type="time">
-
- <progress></progress>
-
-
<select>
diff --git a/source/docs/progress-bars.md b/source/docs/progress-bars.md
new file mode 100644
index 00000000..3ef24b83
--- /dev/null
+++ b/source/docs/progress-bars.md
@@ -0,0 +1,51 @@
+---
+layout: default.html
+title: Progress Bars
+description: These progress bars are easy to create and render consistently in all browsers.
+---
+
+## Progress Bars
+
+HTML5 introduced the `` element, but it’s not currently possible to style consistently in all browsers. As a result, Shoelace offers a custom alternative.
+
+Create a progress bar with the following markup. Use the `progress-small` and `progress-big` modifiers to change the size. To set the state, use a [sizing utility](utilities.html#sizing-utilities) or set the width explicitly on the `progress-bar` element.
+
+An optional text label can be included inside the `progress-bar` element.
+
+```html
+
+
+
+
+
+```
+
+
+
+
+
+
+
+When progress can’t be determined, use the `progress-indeterminate` modifier to set an indeterminate state.
+
+```html
+
+```
+
+
diff --git a/source/layouts/default.html b/source/layouts/default.html
index b0019486..ec4d32c5 100644
--- a/source/layouts/default.html
+++ b/source/layouts/default.html
@@ -38,6 +38,7 @@
Dropdowns
Forms
Loaders
+ Progress Bars
Switches
Tabs
Tables