Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/style.css">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
Expand Down Expand Up @@ -235,6 +236,7 @@ <h2 class="data-error__title">Не удалось загрузить данны
</section>
</template>

<script src="vendor/nouislider/nouislider.js"></script>
<script src="/vendor/pristine/pristine.min.js"></script>
<script type="module" src="js/main.js"></script>

Expand Down
133 changes: 133 additions & 0 deletions js/form/effects.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
const EFFECTS = {
default: {
range: {
min: 0,
max: 100,
},

start: 100,
step: 1,
},

chrome: {
filter: 'grayscale',
range: {
min: 0,
max: 1,
},

start: 1,
step: 0.1,
unit: '',
},

sepia: {
filter: 'sepia',
range: {
min: 0,
max: 1,
},

start: 1,
step: 0.1,
unit: '',
},

marvin: {
filter: 'invert',
range: {
min: 0,
max: 100,
},

start: 100,
step: 1,
unit: '%',
},

phobos: {
filter: 'blur',
range: {
min: 0,
max: 3,
},

start: 3,
step: 0.1,
unit: 'px',
},

heat: {
filter: 'brightness',
range: {
min: 1,
max: 3,
},

start: 3,
step: 0.1,
unit: '',
},
};

const previewPhoto = document.querySelector('.img-upload__preview img');
const sliderContainer = document.querySelector('.img-upload__effect-level');
const sliderInput = document.querySelector('.effect-level__value');
const slider = document.querySelector('.effect-level__slider');

const setSliderEffect = (value) => EFFECTS[value] || EFFECTS.default;

const setSliderStatus = (effect) => sliderContainer.classList.toggle('hidden', effect === EFFECTS.default);

const setSliderValue = (effect, value) => {
if (effect === EFFECTS.default) {
previewPhoto.style.filter = null;

return;
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Перенос строки

previewPhoto.style.filter = `${effect.filter}(${value}${effect.unit})`;
};

const updateSlider = (effect) => {
slider.noUiSlider.off();

slider.noUiSlider.on('update', () => {
sliderInput.value = slider.noUiSlider.get();
setSliderValue(effect, sliderInput.value);
});
};

const createSlider = (value) => {
const effect = setSliderEffect(value);

setSliderStatus(effect);
noUiSlider.create(slider, {
range: {
min: effect.range.min,
max: effect.range.max,
},
start: effect.start,
step: effect.step,
connect: 'lower',
});

updateSlider(effect);
};

const updateSliderOptions = (value) => {
const effect = setSliderEffect(value);

setSliderStatus(effect);
slider.noUiSlider.updateOptions({
range: {
min: effect.range.min,
max: effect.range.max,
},
start: effect.start,
step: effect.step,
});

updateSlider(effect);
};

export {createSlider, updateSliderOptions};
20 changes: 17 additions & 3 deletions js/form/form.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import {isEscapeKey} from '../utils.js';
import {validatePristine, setPristine, resetPristine} from './validate.js';
import {setPhotoScale, resetPhotoScale} from './scale.js';
import {createSlider, updateSliderOptions} from './effects.js';

const uploadInput = document.querySelector('.img-upload__input');
const form = document.querySelector('.img-upload__form');
const formModal = document.querySelector('.img-upload__overlay');
const formCloseButton = document.querySelector('.img-upload__cancel');
const effectsControl = document.querySelector('.effects__list');
const checkedEffect = document.querySelector('.effects__radio[checked]');

const openForm = () => {
formModal.classList.remove('hidden');
Expand All @@ -17,6 +21,10 @@ const openForm = () => {
const closeForm = () => {
form.reset();
resetPristine();
resetPhotoScale();
updateSliderOptions(checkedEffect.value);
uploadInput.value = '';


formModal.classList.add('hidden');
document.body.classList.remove('modal-open');
Expand All @@ -43,7 +51,6 @@ function onDocumentKeydown(evt) {

if (isEscapeKey(evt) && !hashtagsInput && !captionInput) {
evt.preventDefault();

closeForm();
}
}
Expand All @@ -52,11 +59,18 @@ function onUploadInputChange() {
openForm();
}

const initFormAction = () => {
setPristine();
function onEffectsControlChange(evt) {
updateSliderOptions(evt.target.value);
}

const initFormAction = () => {
uploadInput.addEventListener('change', onUploadInputChange);
form.addEventListener('submit', onFormSubmit);
effectsControl.addEventListener('change', onEffectsControlChange);

setPristine();
setPhotoScale();
createSlider(checkedEffect.value);
};

export {initFormAction};
39 changes: 39 additions & 0 deletions js/form/scale.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const SCALE_STEP = 25;
const MIN_SCALE = 25;
const MAX_SCALE = 100;
const DEFAULT_VALUE = 100;
const PERCENT = 100;

const buttonZoomOut = document.querySelector('.scale__control--smaller');
const buttonZoomIn = document.querySelector('.scale__control--bigger');
const previewPhoto = document.querySelector('.img-upload__preview img');
const controlInput = document.querySelector('.scale__control--value');

const getInputValue = () => parseInt(controlInput.value, 10);

const updateScale = (value) => {
previewPhoto.style.transform = `scale(${value / 100})`;
controlInput.value = `${value}%`;
previewPhoto.style.transform = `scale(${value / PERCENT})`;
};

function buttonZoomOutClickHandler() {
const stepBack = Math.max(getInputValue() - SCALE_STEP, MIN_SCALE);

updateScale(stepBack);
}

function buttonZoomInClickHandler() {
const stepForward = Math.min(getInputValue() + SCALE_STEP, MAX_SCALE);

updateScale(stepForward);
}

const setPhotoScale = () => {
buttonZoomOut.addEventListener('click', buttonZoomOutClickHandler);
buttonZoomIn.addEventListener('click', buttonZoomInClickHandler);
};

const resetPhotoScale = () => updateScale(DEFAULT_VALUE);

export {setPhotoScale, resetPhotoScale};
2 changes: 1 addition & 1 deletion js/form/validate.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const CAPTION_MAX_LENGTH = 140;
const INVALID_HASHTAG_UNIQUE = 'Один и тот же хэштег не может быть использован дважды';
const INVALID_HASHTAG_SYMBOLS = 'Хэштег начинается с # и может состоять только из букв и цифр длиной не больше 20 символов';
const INVALID_HASHTAG_COUNT = `Нельзя использовать больше ${HASHTAGS_MAX_COUNT} хэштегов`;
const INVALID_CAPTION = 'Длина комментария не может составлять больше 140 символов';
const INVALID_CAPTION = `Длина комментария не может составлять больше ${CAPTION_MAX_LENGTH} символов`;

const form = document.querySelector('.img-upload__form');
const hashtagsInput = document.querySelector('.text__hashtags');
Expand Down
Loading