Skip to content

Commit 96acd5a

Browse files
authored
Merge branch 'htmlacademy-javascript:master' into master
2 parents ef9ba84 + f1fab9e commit 96acd5a

10 files changed

Lines changed: 188 additions & 10 deletions

File tree

index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<meta charset="utf-8">
66
<meta name="viewport" content="width=device-width,initial-scale=1">
77
<link rel="stylesheet" href="css/normalize.css">
8+
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
89
<link rel="stylesheet" href="css/style.css">
910
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
1011
<title>Кекстаграм</title>
@@ -252,6 +253,7 @@ <h2 class="data-error__title">Не удалось загрузить данны
252253
</template>
253254

254255
<script src="./vendor/pristine/pristine.min.js"></script>
256+
<script src="./vendor/nouislider/nouislider.js"></script>
255257
<script src="./js/main.js" type="module"></script>
256258

257259

js/big-picture.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
/* eslint-disable no-unused-vars */
1+
/* eslint-disable no-use-before-define */
2+
23
const COMMENTS_STEP = 5;
34
const body = document.body;
45
const modalNode = document.querySelector('.big-picture');
@@ -24,13 +25,13 @@ const showModal = (isVisible = true) => {
2425
modalNode.classList.remove('hidden');
2526
body.classList.add('modal-open');
2627

27-
// eslint-disable-next-line no-use-before-define
28+
2829
document.addEventListener('keydown', onDocumentKeydown);
2930
return;
3031
}
3132
modalNode.classList.add('hidden');
3233
body.classList.remove('modal-open');
33-
// eslint-disable-next-line no-use-before-define
34+
3435
document.removeEventListener('keydown', onDocumentKeydown);
3536
};
3637

js/constans.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,88 @@
1+
export const Effects = {
2+
CHROME: 'chrome',
3+
SEPIA: 'sepia',
4+
PHOBOS: 'phobos',
5+
HEAT: 'heat',
6+
NONE: 'none',
7+
MARVIN: 'marvin',
8+
};
9+
10+
export const EffectsSettings = {
11+
[Effects.CHROME]: {
12+
slider: {
13+
range: {
14+
min: 0,
15+
max: 1,
16+
},
17+
start: 1,
18+
step: 0.1,
19+
},
20+
style: 'grayscale',
21+
units: '',
22+
},
23+
[Effects.SEPIA]: {
24+
slider: {
25+
range: {
26+
min: 0,
27+
max: 1,
28+
},
29+
start: 1,
30+
step: 0.1,
31+
},
32+
style: 'sepia',
33+
units: '',
34+
},
35+
[Effects.PHOBOS]: {
36+
slider: {
37+
range: {
38+
min: 0,
39+
max: 3,
40+
},
41+
start: 3,
42+
step: 0.1,
43+
},
44+
style: 'blur',
45+
units: 'px',
46+
},
47+
[Effects.HEAT]: {
48+
slider: {
49+
range: {
50+
min: 1,
51+
max: 3,
52+
},
53+
start: 3,
54+
step: 0.1,
55+
},
56+
style: 'brightness',
57+
units: '',
58+
},
59+
[Effects.NONE]: {
60+
slider: {
61+
range: {
62+
min: 0,
63+
max: 100,
64+
},
65+
start: 100,
66+
step: 1,
67+
connect: 'lower',
68+
},
69+
style: '',
70+
units: '',
71+
},
72+
[Effects.MARVIN]: {
73+
slider: {
74+
range: {
75+
min: 0,
76+
max: 100,
77+
},
78+
start: 100,
79+
step: 1,
80+
},
81+
style: 'invert',
82+
units: '%',
83+
},
84+
};
85+
186
export const MIN_LIKES = 15;
287
export const MAX_LIKES = 200;
388
export const MIN_COMMENTS = 0;

js/data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const getPhoto = (i) => ({
5252
export const getPhotos = (n) => {
5353
const photos = [];
5454
for (let i = 1; i <= n; i++) {
55-
photos.push(getPhoto(i)); // getPhotos(i)
55+
photos.push(getPhoto(i));
5656
}
5757
return photos;
5858
};

js/effects.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* eslint-disable no-shadow */
2+
import { Effects, EffectsSettings } from './constans.js';
3+
4+
const sliderNode = document.querySelector('.effect-level__slider');
5+
const listNode = document.querySelector('.effects__list');
6+
const previewNode = document.querySelector('.img-upload__preview img');
7+
const valueNode = document.querySelector('.effect-level__value');
8+
const sliderContainerNode = document.querySelector('.effect-level');
9+
10+
let currentEffect = Effects.NONE;
11+
const { slider } = EffectsSettings[currentEffect];
12+
13+
noUiSlider.create(sliderNode, slider);
14+
15+
const render = () => {
16+
if (currentEffect === Effects.NONE) {
17+
previewNode.style.filter = '';
18+
return;
19+
}
20+
const { style, units } = EffectsSettings[currentEffect];
21+
previewNode.style.filter = `${style}(${valueNode.value}${units})`;
22+
};
23+
24+
sliderNode.noUiSlider.on('update', () => {
25+
valueNode.value = sliderNode.noUiSlider.get();
26+
render();
27+
});
28+
29+
const updateSlider = () => {
30+
const {slider} = EffectsSettings[currentEffect];
31+
sliderNode.noUiSlider.updateOptions(slider);
32+
};
33+
34+
const showSlider = (isVisible = true) => {
35+
sliderContainerNode.classList.toggle('hidden', !isVisible);
36+
};
37+
38+
listNode.addEventListener('change', ({ target }) => {
39+
currentEffect = target.value;
40+
showSlider(!(currentEffect === Effects.NONE));
41+
updateSlider();
42+
render();
43+
});
44+
45+
export const resetEffects = () => {
46+
currentEffect = Effects.NONE;
47+
showSlider(false);
48+
render();
49+
};
50+
51+
resetEffects();

js/form.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { isValid, resetValidation } from './validation.js';
2+
import { resetScale } from './scale.js';
3+
import { resetEffects } from './effects.js';
24

35
const formNode = document.querySelector('#upload-select-image');
46
const inputFileNode = document.querySelector('#upload-file');
@@ -8,14 +10,19 @@ const closeButtonNode = document.querySelector('#upload-cancel');
810
const closeModal = () => {
911
modalNode.classList.add('hidden');
1012

13+
formNode.reset();
14+
1115
resetValidation();
16+
resetScale();
17+
resetEffects();
1218
};
1319

1420
inputFileNode.addEventListener('change', () => {
1521
modalNode.classList.remove('hidden');
1622
});
1723

18-
closeButtonNode.addEventListener('click', () => {
24+
closeButtonNode.addEventListener('click', (evt) => {
25+
evt.preventDefault();
1926
closeModal();
2027
});
2128

@@ -24,4 +31,3 @@ formNode.addEventListener('submit', (evt) => {
2431
evt.preventDefault();
2532
}
2633
});
27-

js/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import { getPhotos } from './data.js';
22
import { renderCards } from './render-cards.js';
33
import './form.js';
44

5-
// eslint-disable-next-line no-unused-vars
5+
66
const photos = getPhotos(25);
77
renderCards(photos);

js/render-cards.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
/* eslint-disable no-unused-vars */
21
import { openModal } from './big-picture.js';
32

4-
/* eslint-disable no-console */
53
const cardTemplate = document.querySelector('#picture').content.querySelector('.picture');
64
const cardsContainerNode = document.querySelector('.pictures');
75

js/scale.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const Scale = {
2+
MIN: 25,
3+
MAX: 100,
4+
STEP: 25,
5+
DEFAULT: 100
6+
};
7+
8+
const minusButtonNode = document.querySelector('.scale__control--smaller');
9+
const plusButtonNode = document.querySelector('.scale__control--bigger');
10+
const inputNode = document.querySelector('.scale__control--value');
11+
const previewNode = document.querySelector('.img-upload__preview img');
12+
13+
let currentScale;
14+
15+
const render = () => {
16+
inputNode.value = `${currentScale}%`;
17+
previewNode.style.transform = `scale(${currentScale}%)`;
18+
};
19+
20+
minusButtonNode.addEventListener('click', () => {
21+
currentScale = currentScale - Scale.STEP > Scale.MIN ? currentScale - Scale.STEP : Scale.MIN;
22+
render();
23+
});
24+
25+
26+
plusButtonNode.addEventListener('click', () => {
27+
currentScale = currentScale + Scale.STEP < Scale.MAX ? currentScale + Scale.STEP : Scale.MAX;
28+
render();
29+
});
30+
31+
export const resetScale = () => {
32+
currentScale = Scale.DEFAULT;
33+
render();
34+
};
35+
36+
resetScale();

js/validation.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/* eslint-disable no-unused-vars */
21
const formNode = document.querySelector('#upload-select-image');
32
const descriptionNode = formNode.querySelector('.text__description');
43
const hashtagsNode = formNode.querySelector('.text__hashtags');

0 commit comments

Comments
 (0)