// Replace `$search` with `$replace` in `$string`
// @param {String} $string - Initial string
// @param {String} $search - Substring to replace
// @param {String} $replace ('') - New value
// @return {String} - Updated string
@function str-replace($string, $search, $replace: '') {
$index: str-index($string, $search);
@if $index {
@return str-slice($string, 1, $index - 1) + $replace +
str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
}
@return $string;
}
$encoding-reference: (
//('%','%25'), // Encode "%" first, otherwise the "%" from encoded code would be encoded again (which would be bad)
('<', '%3C'),
('>', '%3E'),
//('"','%22'), // Replace " with ' because that's shorter than %22 and normally working
('"', "'"),
('#', '%23'),
('&', '%26') // Here are a few more characters you could encode
//(' ','%20'),
//('!','%21'),
//('$','%24'),
//(',','%27'),
//('(','%28'),
//(')','%29'),
//('*','%2A'),
//('+','%2B'),
//('"','%2C'),
//('/','%2F'),
//(':','%3A'),
//(';','%3B'),
//('=','%3D'),
//('?','%3F'),
//('@','%40'),
//('[','%5B'),
//(']','%5D'),
//('^','%5E'),
//('`','%60'),
//('{','%7B'),
//('|','%7C'),
//('}','%7D'),
//('~','%7E'),
//(',','%E2%80%9A'),
//('\\','%5C'),
//('_','%5F'),
//('-','%2D'),
//('.','%2E'),
// ('\','%5C'),
// (' ','%7F'),
// ('`','%E2%82%AC'),
//('ƒ','%C6%92'),
//('„','%E2%80%9E'),
//('…','%E2%80%A6'),
//('†','%E2%80%A0'),
//('‡','%E2%80%A1'),
//('ˆ','%CB%86'),
//('‰','%E2%80%B0'),
//('Š','%C5%A0'),
//('‹','%E2%80%B9'),
//('Œ','%C5%92'),
//('','%C5%8D'),
//('Ž','%C5%BD'),
//('','%8F'),
//('','%C2%90'),
//(','%'E2%80%98'),
//(','%'E2%80%99'),
//('“','%E2%80%9C'),
//('”','%E2%80%9D'),
//('•','%E2%80%A2'),
//('–','%E2%80%93'),
//('—','%E2%80%94'),
//('˜','%CB%9C'),
//('™','%E2%84'),
//('š','%C5%A1'),
//('›','%E2%80'),
//('œ','%C5%93'),
//('','%9D'),
//('ž','%C5%BE'),
//('Ÿ','%C5%B8'),
//(' ','%C2%A0'),
//('¡','%C2%A1'),
//('¢','%C2%A2'),
//('£','%C2%A3'),
//('¤','%C2%A4'),
//('¥','%C2%A5'),
//('¦','%C2%A6'),
//('§','%C2%A7'),
//('¨','%C2%A8'),
//('©','%C2%A9'),
//('ª','%C2%AA'),
//('«','%C2%AB'),
//('¬','%C2%AC'),
//(','%'C2%AD'),
//('®','%C2%AE'),
//('¯','%C2%AF'),
//('°','%C2%B0'),
//('±','%C2%B1'),
//('²','%C2%B2'),
//('³','%C2%B3'),
//('´','%C2%B4'),
//('µ','%C2%B5'),
//('¶','%C2%B6'),
//('·','%C2%B7'),
//('¸','%C2%B8'),
//('¹','%C2%B9'),
//('º','%C2%BA'),
//('»','%C2%BB'),
//('¼','%C2%BC'),
//('½','%C2%BD'),
//('¾','%C2%BE'),
//('¿','%C2%BF'),
//('À','%C3%80'),
//('Á','%C3%81'),
//('Â','%C3%82'),
//('Ã','%C3%83'),
//('Ä','%C3%84'),
//('Å','%C3%85'),
//('Æ','%C3%86'),
//('Ç','%C3%87'),
//('È','%C3%88'),
//('É','%C3%89'),
//('Ê','%C3%8A'),
//('Ë','%C3%8B'),
//('Ì','%C3%8C'),
//('Í','%C3%8D'),
//('Î','%C3%8E'),
//('Ï','%C3%8F'),
//('Ð','%C3%90'),
//('Ñ','%C3%91'),
//('Ò','%C3%92'),
//('Ó','%C3%93'),
//('Ô','%C3%94'),
//('Õ','%C3%95'),
//('Ö','%C3%96'),
//('×','%C3%97'),
//('Ø','%C3%98'),
//('Ù','%C3%99'),
//('Ú','%C3%9A'),
//('Û','%C3%9B'),
//('Ü','%C3%9C'),
//('Ý','%C3%9D'),
//('Þ','%C3%9E'),
//('ß','%C3%9F'),
//('à','%C3%A0'),
//('á','%C3%A1'),
//('â','%C3%A2'),
//('ã','%C3%A3'),
//('ä','%C3%A4'),
//('å','%C3%A5'),
//('æ','%C3%A6'),
//('ç','%C3%A7'),
//('è','%C3%A8'),
//('é','%C3%A9'),
//('ê','%C3%AA'),
//('ë','%C3%AB'),
//('ì','%C3%AC'),
//('í','%C3%AD'),
//('î','%C3%AE'),
//('ï','%C3%AF'),
//('ð','%C3%B0'),
//('ñ','%C3%B1'),
//('ò','%C3%B2'),
//('ó','%C3%B3'),
//('ô','%C3%B4'),
//('õ','%C3%B5'),
//('ö','%C3%B6'),
//('÷','%C3%B7'),
//('ø','%C3%B8'),
//('ù','%C3%B9'),
//('ú','%C3%BA'),
//('û','%C3%BB'),
//('ü','%C3%BC'),
//('ý','%C3%BD'),
//('þ','%C3%BE'),
//('ÿ','%C3%BF')
);
@function svg-encode($svg) {
@each $char, $encoded in $encoding-reference {
$svg: str-replace($svg, $char, $encoded);
}
@return 'data:image/svg+xml,' + $svg;
}
@mixin svg-background-image($svg) {
background-image: url(svg-encode($svg)), linear-gradient(transparent, transparent);
}
@mixin range-focus {
background-color: var(--body-bg-color);
background-color: var(--theme-color, var(--default-theme-color));
}
@mixin range-track {
width: 100%;
height: 16px;
cursor: pointer;
border-radius: 9999em;
border: 1px solid var(--input-border-color);
background: var(--input-bg-color);
}
@mixin range-thumb {
width: 20px;
height: 20px;
cursor: pointer;
-webkit-appearance: none;
border: none;
border-radius: 999em;
background-color: var(--input-border-color);
}
@mixin range-ms-fill {
border-radius: 999em;
border: 1px solid var(--input-border-color);
background: var(--input-bg-color);
}
@mixin form_controls() {
:root {
--checkbox-width: 1.143em;
--checkbox-height: 1.143em;
}
button,
input,
select,
textarea {
overflow: visible;
}
input[type='text'],
input[type='email'],
input[type='number'],
input[type='password'],
input[type='file'],
input[type='range'],
input[type='reset'],
input[type='radio'],
input[type='checkbox'],
select,
textarea {
appearance: none;
}
button,
input,
select,
textarea {
&:focus {
outline: 0;
}
}
input[type='text'],
input[type='email'],
input[type='number'],
input[type='password'],
input[type='file'],
input[type='reset'],
input[type='radio'],
input[type='checkbox'],
select,
textarea {
&:focus {
box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.25);
}
}
input[type='text'],
input[type='email'],
input[type='number'],
input[type='password'],
input[type='file'],
input[type='reset'],
select,
textarea {
&:focus {
border-color: var(--theme-color, var(--default-theme-color));
}
}
input,
select,
textarea {
padding: 0.57142875em;
line-height: 1.3;
color: var(--input-color);
border-radius: 1px;
border-width: 1px;
border-style: solid;
border-color: var(--input-border-color);
background-color: var(--input-bg-color);
&:disabled {
cursor: not-allowed;
background-color: var(--input-disabled-bg-color);
}
&.input-success {
border-color: var(--success-color);
}
&.input-warning {
border-color: var(--warning-color);
}
&.input-error {
border-color: var(--danger-color);
}
}
label {
display: inline-block;
line-height: 1.1;
margin-bottom: 0.5em;
}
select {
padding-right: 32px;
background-size: 24px;
background-repeat: no-repeat;
background-position: right 4px center;
@include svg-background-image(
''
);
.dark_theme & {
@include svg-background-image(
''
);
}
&[multiple] {
padding: 0;
overflow: auto;
background-image: none;
option {
padding: 0.7143em 0.57142875em;
margin: 1px;
}
}
}
textarea {
min-height: 2.75rem;
height: 160px;
min-width: 0.5 * 18.75rem;
max-width: 100%;
}
input[type='file'] {
max-width: 100%;
}
input[type='range'] {
display: block;
max-width: none;
min-height: 40px;
padding: 1em 1px;
border: none;
border-radius: 0;
background: none;
&:focus {
&::-webkit-slider-thumb {
@include range-focus;
}
&::-moz-range-thumb {
@include range-focus;
}
&::-ms-thumb {
@include range-focus;
}
}
&::-webkit-slider-runnable-track {
@include range-track;
}
&::-moz-range-track {
@include range-track;
}
&::-ms-track {
@include range-track;
}
&::-webkit-slider-thumb {
@include range-thumb;
appearance: none;
margin-top: -0.19rem;
}
&::-moz-range-thumb {
@include range-thumb;
}
&::-ms-thumb {
@include range-thumb;
}
&::-ms-fill-lower {
@include range-ms-fill;
}
&::-ms-fill-upper {
@include range-ms-fill;
}
}
input[type='radio'],
input[type='checkbox'],
*.radio-label .selectbox,
*.checkbox-label .selectbox {
width: var(--checkbox-width);
height: var(--checkbox-height);
vertical-align: middle;
}
input[type='radio'],
input[type='checkbox'] {
margin: 0 0.75em;
&:focus {
border-color: var(--input-border-color);
box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.25);
}
&:active {
opacity: 0.85;
}
&:checked {
background-size: 20px auto;
background-repeat: no-repeat;
background-size: cover;
background-position: center center;
background-color: var(--theme-color, var(--default-theme-color));
border-color: var(--theme-color, var(--default-theme-color));
}
&:disabled {
border-color: var(--input-border-color);
background-color: var(--input-disabled-bg-color);
}
&:checked:disabled {
background-color: var(--input-border-color);
}
}
*.radio-label,
*.checkbox-label {
.selectbox {
background-color: var(--input-bg-color);
border: 1px solid var(--input-border-color);
}
input[type='radio'],
input[type='checkbox'] {
&:focus ~ .selectbox {
border-color: var(--input-border-color);
box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.25);
}
&:active ~ .selectbox {
opacity: 0.85;
}
&:checked ~ .selectbox {
background-size: 20px auto;
background-repeat: no-repeat;
background-size: cover;
background-position: center center;
background-color: var(--theme-color, var(--default-theme-color));
border-color: var(--theme-color, var(--default-theme-color));
}
&:disabled ~ .selectbox {
border-color: var(--input-border-color);
background-color: var(--input-disabled-bg-color);
}
&:checked:disabled ~ .selectbox {
background-color: var(--input-border-color);
}
}
}
input[type='radio'],
input[type='radio'] ~ .selectbox {
border-radius: 99em;
}
input[type='radio']:checked,
input[type='radio']:checked ~ .selectbox {
@include svg-background-image(
''
);
}
input[type='radio']:checked:disabled,
input[type='radio']:checked:disabled ~ .selectbox {
@include svg-background-image(
''
);
}
input[type='checkbox']:checked,
input[type='checkbox']:checked ~ .selectbox {
@include svg-background-image(
''
);
}
input[type='checkbox']:checked:disabled,
input[type='checkbox']:checked:disabled ~ .selectbox {
@include svg-background-image(
''
);
}
*.radio-label,
*.checkbox-label {
position: relative;
line-height: 1.143;
margin-right: 1em;
cursor: pointer;
.selectbox {
display: inline-block;
margin-right: 0.75em;
}
&.right-selectbox .selectbox {
margin-right: 0;
margin-left: 0.75em;
}
input[type='radio'],
input[type='checkbox'] {
position: absolute;
left: -999em;
}
}
label,
.input-message {
+ input:not([type='radio']):not([type='checkbox']),
+ select,
+ textarea,
+ button {
display: block;
margin-bottom: 1em;
}
}
.input-message {
display: inline-block;
line-height: 1.1;
margin-bottom: 0.5em;
&.success-message {
color: var(--success-color);
}
&.warning-message {
color: var(--warning-color);
}
&.error-message {
color: var(--danger-color);
}
}
label + .input-message {
display: block;
}
}
.num-value-unit {
.label {
display: block;
padding: 0 0 4px;
}
.value-input,
.value-unit {
position: relative;
float: left;
width: auto;
&:focus,
&:active {
z-index: +1;
}
}
.value-input {
margin-right: -1px;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
}
.value-unit {
}
}