diff --git a/.babelrc b/.babelrc deleted file mode 100644 index c13c5f6..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015"] -} diff --git a/Readme.md b/Readme.md index 884fcda..d7c5e1c 100644 --- a/Readme.md +++ b/Readme.md @@ -1,42 +1,5 @@ # Стиль кода Академии HTML -[![dependency status][dependency-image]][dependency-url] -[![devDependency status][devdependency-image]][devdependency-url] - -_TBD_ - -## Сервер для разработки - -Для запуска лайв-сервера нужен [Node.js](https://nodejs.org) версии 0.12 или выше. - -### Установка - -```bash -$ git clone https://github.com/htmlacademy/codeguide.git -$ cd codeguide -$ npm i -``` - -### Запуск - -```bash -$ npm start -``` - -После выполнения команды, откройте в браузере `http://127.0.0.1:3000`. - -### Тестирование - -```bash -$ npm test -``` - -Для проверки скриптов используется [ESLint](http://eslint.org). - -## Нашли ошибку? - -Пожалуйста, [создайте тикет](https://github.com/htmlacademy/codeguide/issues). - ## Благодарности * [Code Guide](http://codeguide.co) by @mdo @@ -47,8 +10,3 @@ $ npm test ## Лицензия Лицензия MIT, смотрите файл `License.md`. - -[dependency-image]: https://david-dm.org/htmlacademy/codeguide.svg?style=flat-square -[dependency-url]: https://david-dm.org/htmlacademy/codeguide -[devdependency-image]: https://david-dm.org/htmlacademy/codeguide/dev-status.svg?style=flat-square -[devdependency-url]: https://david-dm.org/htmlacademy/codeguide#info=devDependencies diff --git a/app/css/chapter.css b/app/css/chapter.css deleted file mode 100644 index 5c13650..0000000 --- a/app/css/chapter.css +++ /dev/null @@ -1,57 +0,0 @@ -.chapter h2 { - padding: 2rem 1rem; - - background-color: var(--subtle-color); - - @media (--viewport-medium) { - padding: 2rem 2rem 2.5rem; - } - - @media (--viewport-large) { - padding: 2rem 3rem 2.5rem; - } -} - -.chapter-part { - display: flex; - flex-direction: column; - - border-bottom: 1px solid var(--subtle-color); - - @media (--viewport-large) { - flex-direction: row; - } -} - -.chapter-part-col { - padding: 2rem 1rem; - - @media (--viewport-medium) { - padding: 2rem; - } - - @media (--viewport-large) { - width: 50%; - padding: 3rem; - } - - & + .chapter-part-col { - border-top: 1px solid var(--subtle-color); - - @media (--viewport-large) { - border-top: 0; - } - } - - figure { - margin: 0 1rem 0 0; - } - - p { - max-width: 32rem; - } -} - -.gray-bgcolor { - background-color: var(--light-subtle-color); -} diff --git a/app/css/footer.css b/app/css/footer.css deleted file mode 100644 index 00bac59..0000000 --- a/app/css/footer.css +++ /dev/null @@ -1,67 +0,0 @@ -footer { - padding: 2rem; - - background-color: var(--brand-color-dark); -} - -.contacts { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.logo-full { - display: inline-block; - width: 161px; -} - -.social-icons { - display: flex; - justify-content: space-between; - align-items: center; - margin: 0.5rem 0 1rem 0; -} - -.social-icons, -.github { - font-size: 0; -} - -.icon { - min-width: 2rem; - min-height: 2rem; - - background-repeat: no-repeat; - background-position: center; - background-size: calc(100% - 5px); - opacity: 0.5; - - &:hover { - opacity: 1; - } - - &-vk { - background-image: resolve("icon-vkontakte.svg"); - } - - &-fb { - background-image: resolve("icon-facebook.svg"); - } - - &-tw { - background-image: resolve("icon-twitter.svg"); - } - - &-ig { - background-image: resolve("icon-instagram.svg"); - } -} - -.github-link { - display: inline-block; - width: 91px; - height: 16px; - - background-image: resolve("github.svg"); -} diff --git a/app/css/general.css b/app/css/general.css deleted file mode 100644 index 5f1107d..0000000 --- a/app/css/general.css +++ /dev/null @@ -1,89 +0,0 @@ -html { - font-size: var(--base-px-size); - - @media (--viewport-large) { - font-size: var(--large-px-size); - } -} - -body { - margin: 0; - - font: 17px/1.6 "Helvetica", "Arial", sans-serif; - color: var(--dark-color); - - background-color: var(--light-color); -} - -a:any-link { - color: var(--dark-color); - text-decoration: underline; -} - -a:hover { - text-decoration: none; -} - -h1, -h2, -h4 { - margin: 0; - - font-weight: normal; - color: var(--darker-color); - letter-spacing: -0.025em; -} - -h2, -h4 { - line-height: 1.2; -} - -h1 { - font-size: 3rem; - line-height: 1.3; -} - -h2 { - font-size: 2.5rem; -} - -h4 { - font-size: 1.75rem; -} - -code, -pre { - font-family: "Consolas", "Liberation Mono", "Menlo", "Courier", monospace; -} - -code { - padding: 2px 4px; - - font-size: 95%; - color: #d44950; - - background-color: #f7f7f9; - border-radius: 0.2rem; -} - -pre { - display: block; - margin: 0 0 1rem; - - line-height: 1.4; - white-space: pre-wrap; -} - -pre code { - padding: 0; - - color: inherit; - - background-color: transparent; - border: 0; -} - -ul li { - margin-bottom: 0.25rem; -} diff --git a/app/css/header.css b/app/css/header.css deleted file mode 100644 index 9cfa541..0000000 --- a/app/css/header.css +++ /dev/null @@ -1,33 +0,0 @@ -header { - padding: 1rem 1rem 6rem; - - text-align: center; - - background-color: var(--brand-color); - background-image: repeating-linear-gradient(150deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.06) 1px, transparent 0, transparent 41px), repeating-linear-gradient(-150deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.06) 1px, transparent 0, transparent 41px); - - @media (--viewport-medium) { - padding-bottom: 4rem; - } - - h1 { - margin: 0 0 0.25rem; - - color: var(--light-color); - } - - p { - margin-top: 0; - - font-size: 1.1rem; - } - - a:any-link { - color: var(--light-color); - } -} - -.logo { - width: 300px; - height: 300px; -} diff --git a/app/css/prism.css b/app/css/prism.css deleted file mode 100644 index 4b0f50a..0000000 --- a/app/css/prism.css +++ /dev/null @@ -1,15 +0,0 @@ -/* override default prism theme */ -code[class*="language-"], -pre[class*="language-"] { - white-space: pre-wrap; -} - -pre[class*="language-"] { - margin: 0; - padding: 0; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: initial; -} diff --git a/app/css/style.css b/app/css/style.css deleted file mode 100644 index df17289..0000000 --- a/app/css/style.css +++ /dev/null @@ -1,11 +0,0 @@ -@import "normalize.css"; -@import "variables.css"; - -@import "prismjs-default-theme/prism-default.css"; - -@import "general.css"; -@import "prism.css"; - -@import "header.css"; -@import "chapter.css"; -@import "footer.css"; diff --git a/app/css/variables.css b/app/css/variables.css deleted file mode 100644 index e3e493b..0000000 --- a/app/css/variables.css +++ /dev/null @@ -1,19 +0,0 @@ -:root { - --base-px-size: 16px; - --large-px-size: calc(var(--base-px-size) * 1.25); - - --brand-color: #312785; - --brand-color-dark: #2d2d44; - - --dark-color: #5a5a5a; - --darker-color: color(var(--dark-color) blackness(+50%)); - - --subtle-color: #e5e5e5; - - --light-color: #ffffff; - --light-subtle-color: color(var(--subtle-color) lightness(+8%)); - --lighter-subtle-color: color(var(--subtle-color) lightness(+5%)); -} - -@custom-media --viewport-large (min-width: 48em); -@custom-media --viewport-medium (min-width: 38em); diff --git a/app/img/bane.svg b/app/img/bane.svg deleted file mode 100644 index 2e5cc47..0000000 --- a/app/img/bane.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/img/github.svg b/app/img/github.svg deleted file mode 100644 index e1cffa9..0000000 --- a/app/img/github.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/js/app.js b/app/js/app.js deleted file mode 100644 index fb99126..0000000 --- a/app/js/app.js +++ /dev/null @@ -1 +0,0 @@ -import 'prismjs'; diff --git a/app/templates/helpers/import.js b/app/templates/helpers/import.js deleted file mode 100644 index 315dd3c..0000000 --- a/app/templates/helpers/import.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -const fs = require('fs-extra'); -const path = require('path'); -const resolve = require('./resolve'); - -const root = path.resolve('build/'); - -module.exports = function(url) { - let file = path.join(root, resolve(url)); - let content = ''; - - try { - content = fs.readFileSync(file, {'encoding': 'utf8'}); - } catch (e) { - content = e; - } - - return content; -}; diff --git a/app/templates/helpers/resolve.js b/app/templates/helpers/resolve.js deleted file mode 100644 index fd6ed77..0000000 --- a/app/templates/helpers/resolve.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -const fs = require('fs-extra'); -const path = require('path'); - -const options = require(path.resolve('config/kit')); - -const root = path.resolve('build/'); -const discover = options.discover.map(function(folder) { - return path.resolve(root, folder); -}); - -module.exports = function(url) { - let file; - - let found = discover.some(function(folder) { - file = path.join(folder, url); - return fs.existsSync(file); - }); - - if (found) { - url = file.replace(root, ''); - } - - return url; -}; diff --git a/app/templates/index.hbs b/app/templates/index.hbs deleted file mode 100644 index 1fe672b..0000000 --- a/app/templates/index.hbs +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Стиль кода Академии HTML - - - - - - - - - - - - - -
- {{~> header ~}} - -
-

Оглавление

-
- - -
-
- -
-

HTML

- {{~> html/html-rules ~}} -
- -
-

CSS

- {{~> css/css-rules ~}} -
- - {{~> footer ~}} -
- - - - diff --git a/app/templates/partials/css/css-recomendations.hbs b/app/templates/partials/css/css-recomendations.hbs deleted file mode 100644 index e76af10..0000000 --- a/app/templates/partials/css/css-recomendations.hbs +++ /dev/null @@ -1,51 +0,0 @@ -
-
- {{~> css/recomendations/css-selectors ~}} -
-
-
-

-        {{~> css/examples/css-selectors-example ~}}
-      
-
-
-
- -
-
- {{~> css/recomendations/css-important ~}} -
-
-
-

-        {{~> css/examples/css-important-example ~}}
-      
-
-
-
- -
-
- {{~> css/recomendations/css-shorthand ~}} -
-
-
-

-        {{~> css/examples/css-shorthand-example ~}}
-      
-
-
-
- -
-
- {{~> css/rules/css-vertical-align ~}} -
-
-
-

-        {{~> css/examples/css-vertical-align-example ~}}
-      
-
-
-
diff --git a/app/templates/partials/css/css-rules.hbs b/app/templates/partials/css/css-rules.hbs deleted file mode 100644 index 8946e60..0000000 --- a/app/templates/partials/css/css-rules.hbs +++ /dev/null @@ -1,64 +0,0 @@ -
-
- {{~> css/rules/css-syntax ~}} -
-
-
-

-        {{~> css/examples/css-syntax-example ~}}
-      
-
-
-
- -
-
- {{~> css/rules/css-order ~}} -
-
-
-

-        {{~> css/examples/css-order-example ~}}
-      
-
-
-
- -
-
- {{~> css/rules/css-class-names ~}} -
-
-
-

-        {{~> css/examples/css-class-names-example ~}}
-      
-
-
-
- -
-
- {{~> css/rules/css-import ~}} -
-
-
-

-        {{~> css/examples/css-import-example ~}}
-      
-
-
-
- -
-
- {{~> css/rules/css-font-variant ~}} -
-
-
-

-        {{~> css/examples/css-font-variant-example ~}}
-      
-
-
-
diff --git a/app/templates/partials/css/examples/css-class-names-example.hbs b/app/templates/partials/css/examples/css-class-names-example.hbs deleted file mode 100644 index c4a74d4..0000000 --- a/app/templates/partials/css/examples/css-class-names-example.hbs +++ /dev/null @@ -1,11 +0,0 @@ -/* Хорошо */ -.alert-danger { … } -.tweet .user-picture { … } -.button { … } -.layout-center { … } - -/* Плохо */ -.testElement { … } -.t { … } -.big_red_button { … } -.knopka { … } diff --git a/app/templates/partials/css/examples/css-font-variant-example.hbs b/app/templates/partials/css/examples/css-font-variant-example.hbs deleted file mode 100644 index 322185b..0000000 --- a/app/templates/partials/css/examples/css-font-variant-example.hbs +++ /dev/null @@ -1,24 +0,0 @@ -/* Хорошо: указан альтернативный веб-безопасный шрифт и его тип семейства */ -body { - font-family: "Helvetica", "Arial", sans-serif; -} - -/* Кому-то нравится Arial, кому-то Tahoma */ -body { - font-family: "Helvetica", "Tahoma", sans-serif; -} - -/* Плохо: указан только нестандартный шрифт */ -body { - font-family: "Helvetica"; -} - -/* Плохо: указан только нестандартный шрифт и тип семейства, альтернативный веб-безопасный шрифт отсутствует */ -body { - font-family: "Helvetica", sans-serif; -} - -/* Плохо: Georgia — шрифт с засечками, а нестандартный шрифт — без засечек */ -body { - font-family: "Helvetica", "Georgia", sans-serif; -} diff --git a/app/templates/partials/css/examples/css-import-example.hbs b/app/templates/partials/css/examples/css-import-example.hbs deleted file mode 100644 index 17d9ef0..0000000 --- a/app/templates/partials/css/examples/css-import-example.hbs +++ /dev/null @@ -1,7 +0,0 @@ -<!-- Хорошо: подключение тегом link --> -<link rel="stylesheet" href="module.css"> - -<!-- Плохо --> -<style> - @import url("module.css"); -</style> diff --git a/app/templates/partials/css/examples/css-important-example.hbs b/app/templates/partials/css/examples/css-important-example.hbs deleted file mode 100644 index 9a77ef6..0000000 --- a/app/templates/partials/css/examples/css-important-example.hbs +++ /dev/null @@ -1,5 +0,0 @@ -/* Возможно !important здесь не нужен */ -.text-page p { - font-size: 14px !important; - line-height: 20px !important; -} diff --git a/app/templates/partials/css/examples/css-order-example.hbs b/app/templates/partials/css/examples/css-order-example.hbs deleted file mode 100644 index 824ed81..0000000 --- a/app/templates/partials/css/examples/css-order-example.hbs +++ /dev/null @@ -1,38 +0,0 @@ -.declaration-order { - /* Позиционирование */ - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 100; - - /* Блочная модель */ - display: block; - float: right; - width: 100px; - height: 100px; - margin: 10px; - padding: 10px; - - /* Типографика */ - font: normal 13px/1.5 "Arial", sans-serif; - font-style: normal; - font-size: 13px; - line-height: 1.5; - font-family: "Arial", sans-serif; - text-align: center; - color: #333333; - - /* Оформление */ - background-color: #f5f5f5; - border: 1px solid #e5e5e5; - border-radius: 3px; - opacity: 1; - - /* Анимация */ - transition: color 1s; - - /* Разное */ - will-change: auto; -} diff --git a/app/templates/partials/css/examples/css-selectors-example.hbs b/app/templates/partials/css/examples/css-selectors-example.hbs deleted file mode 100644 index b2e97ad..0000000 --- a/app/templates/partials/css/examples/css-selectors-example.hbs +++ /dev/null @@ -1,12 +0,0 @@ -/* Хорошо */ -.catalog { … } -.catalog-item img { … } -.catalog-item .item-description { … } -.catalog-item h3 { … } -.catalog-item:nth-child(odd):hover .item-description::after { … } /* это тоже два уровня вложенности */ - -/* Плохо */ -.catalog .catalog-item .item-description .subtitle { … } -#header { … } -div > p > a > span { … } -a.link, span.text { … } diff --git a/app/templates/partials/css/examples/css-shorthand-example.hbs b/app/templates/partials/css/examples/css-shorthand-example.hbs deleted file mode 100644 index 138a885..0000000 --- a/app/templates/partials/css/examples/css-shorthand-example.hbs +++ /dev/null @@ -1,16 +0,0 @@ -/* Хорошо */ -.element { - margin-bottom: 10px; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - background-color: red; - background-image: url("image.jpg"); -} - -/* Плохо */ -.element { - margin: 0 0 10px; - border-radius: 3px 3px 0 0; - background: red; - background: url("image.jpg"); -} diff --git a/app/templates/partials/css/examples/css-syntax-example.hbs b/app/templates/partials/css/examples/css-syntax-example.hbs deleted file mode 100644 index 09a6a2a..0000000 --- a/app/templates/partials/css/examples/css-syntax-example.hbs +++ /dev/null @@ -1,16 +0,0 @@ -/* Хорошо */ -.selector, -.selector-secondary, -.selector[type="text"] { - padding: 15px; - margin-bottom: 15px; - background-color: rgba(0, 0, 0, 0.5); - box-shadow: 0 1px 2px #cccccc, inset 0 1px 0 #ffffff; -} - -/* Плохо */ -.selector, .selector-secondary, .selector[type=text]{ - padding:15px; - margin:0px 0px 15px; - background-color:rgba(0,0,0,.5); - box-shadow:0px 1px 2px #CCC,inset 0 1px 0 #FFFFFF} diff --git a/app/templates/partials/css/examples/css-vertical-align-example.hbs b/app/templates/partials/css/examples/css-vertical-align-example.hbs deleted file mode 100644 index 59d73fd..0000000 --- a/app/templates/partials/css/examples/css-vertical-align-example.hbs +++ /dev/null @@ -1,15 +0,0 @@ -/* Хорошо */ -.login-button { - display: inline-block; - vertical-align: baseline; -} - -.grid-item { - display: inline-block; - vertical-align: top; -} - -/* Плохо */ -.login-button { - display: inline-block; -} diff --git a/app/templates/partials/css/recomendations/css-important.hbs b/app/templates/partials/css/recomendations/css-important.hbs deleted file mode 100644 index 72a9642..0000000 --- a/app/templates/partials/css/recomendations/css-important.hbs +++ /dev/null @@ -1,7 +0,0 @@ -

Использование !important

-

- В большинстве случаев необходимость использования !important в CSS возникает из-за неправильного обращения к элементам страницы через каскад. Однако, в редких случаях, без использования !important не обойтись. -

-

- Подробнее в статье: http://meiert.com/en/blog/20150310/important/. -

diff --git a/app/templates/partials/css/recomendations/css-selectors.hbs b/app/templates/partials/css/recomendations/css-selectors.hbs deleted file mode 100644 index 829bd1e..0000000 --- a/app/templates/partials/css/recomendations/css-selectors.hbs +++ /dev/null @@ -1,5 +0,0 @@ -

Селекторы

-

Селекторы должны быть написаны так, чтобы их можно было переиспользовать в дальнейшем. Цепочки селекторов или селекторы с излишней вложенностью не должны создаваться без необходимости — это увеличивает специфичность правил и уменьшает возможность их переиспользования.

-

Длинные цепочки вложенных селекторов также усложняют код и его поддержку. Хорошим подходом считается использовать вложенность до 2 или 3 уровня. Псевдоэлементы или псевдоклассы не увеличивают уровень вложенности. -

-

Идентификаторы id для стилизации не используются. Вместо идентификаторов для задания стилей используются селекторы по классам или тегам.

diff --git a/app/templates/partials/css/recomendations/css-shorthand.hbs b/app/templates/partials/css/recomendations/css-shorthand.hbs deleted file mode 100644 index fbb4e6a..0000000 --- a/app/templates/partials/css/recomendations/css-shorthand.hbs +++ /dev/null @@ -1,31 +0,0 @@ -

Сокращенная запись

-

Cокращенные объявления не используются в тех случаях, когда это может косвенно переопределить другие значения. Наиболее часто злоупотребляют сокращением следующих свойств:

- -

- Сокращённые свойства, где элементы значений однотипные (например, - margin: 10px 15px; или - padding: 1px 2px 3px;) сложнее воспринимать, чем отдельные свойства (margin-top: 10px; padding-top: 1px;). -

-

- Свойства с разнотипными элементами значений (например, - border: 1px solid #000000;) в сокращённом виде считываются легче – их можно сокращать, если нет опасности переопределить другие значения. -

diff --git a/app/templates/partials/css/rules/css-class-names.hbs b/app/templates/partials/css/rules/css-class-names.hbs deleted file mode 100644 index 815d7ab..0000000 --- a/app/templates/partials/css/rules/css-class-names.hbs +++ /dev/null @@ -1,6 +0,0 @@ -

Имена классов

- diff --git a/app/templates/partials/css/rules/css-font-variant.hbs b/app/templates/partials/css/rules/css-font-variant.hbs deleted file mode 100644 index 1da89ef..0000000 --- a/app/templates/partials/css/rules/css-font-variant.hbs +++ /dev/null @@ -1,18 +0,0 @@ -

Варианты шрифта

-

- Альтернативные варианты шрифта и тип семейства указываются в конце перечисления font-family. -

-

- В случае использования нестандартных шрифтов альтернативный веб-безопасный шрифт и тип семейства указываются, чтобы в случае отсутствия нестандартного шрифта в системе, изменения внешнего вида страницы были минимальны. Альтернативный шрифт должен быть такого же типа, что и нестандартный. -

-

- Порядок шрифтов следующий: -

-
    -
  1. нестандартный шрифт;
  2. -
  3. веб-безопасный;
  4. -
  5. тип шрифта.
  6. -
-

- Список веб-безопасных шрифтов можно посмотреть здесь — cssfontstack.com. -

diff --git a/app/templates/partials/css/rules/css-import.hbs b/app/templates/partials/css/rules/css-import.hbs deleted file mode 100644 index 846ec3c..0000000 --- a/app/templates/partials/css/rules/css-import.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Правило @import

-

- Правило @import работает медленнее, чем тег <link>. В стилях @import не должен использоваться. -

diff --git a/app/templates/partials/css/rules/css-order.hbs b/app/templates/partials/css/rules/css-order.hbs deleted file mode 100644 index 5495884..0000000 --- a/app/templates/partials/css/rules/css-order.hbs +++ /dev/null @@ -1,24 +0,0 @@ -

Порядок свойств

-

- Объявления логически связанных свойств группируются в следующем порядке: -

-
    -
  1. Позиционирование
  2. -
  3. Блочная модель
  4. -
  5. Типографика
  6. -
  7. Оформление
  8. -
  9. Анимация
  10. -
  11. Разное
  12. -
-

- Позиционирование следует первым потому, что оно влияет на положение блоков в потоке документа. Блочная модель идёт следующей, так как она определяет размеры и расположение блоков. -

-

- Все остальные объявления, которые изменяют вид внутренних частей блоков и не оказывают влияния на другие блоки, идут в последнюю очередь. -

-

- Сгруппированные объявления в правиле отделяются друг от друга пустой строкой. -

-

- Порядок объявления подробных правил, таких как font-size, font-family, line-height, должен соответствовать порядку в сокращённой версии правила. В случае совместного использования подробных и сокращённых правил, первой должна идти сокращённая версия. -

diff --git a/app/templates/partials/css/rules/css-syntax.hbs b/app/templates/partials/css/rules/css-syntax.hbs deleted file mode 100644 index 27b1124..0000000 --- a/app/templates/partials/css/rules/css-syntax.hbs +++ /dev/null @@ -1,22 +0,0 @@ -

Синтаксис

- diff --git a/app/templates/partials/css/rules/css-vertical-align.hbs b/app/templates/partials/css/rules/css-vertical-align.hbs deleted file mode 100644 index 4f8671e..0000000 --- a/app/templates/partials/css/rules/css-vertical-align.hbs +++ /dev/null @@ -1,10 +0,0 @@ -

Указание vertical-align

-

- Значение vertical-align должно быть явно указано для блоков с display: inline-block. -

-

- Значение по умолчанию, baseline, может приводить к странному отображению блочно-строчных элементов. Например, когда в ряд стоят несколько элементов с разным количеством строк. -

-

- Если вы хотите, чтобы элементы выравнивались по умолчанию, то явно укажите для vertical-align значение baseline. Это позволит другим понять, что вы знаете об особенностях отображения элементов с таким выравниванием и задали его намеренно. -

diff --git a/app/templates/partials/footer.hbs b/app/templates/partials/footer.hbs deleted file mode 100644 index b11f00c..0000000 --- a/app/templates/partials/footer.hbs +++ /dev/null @@ -1,26 +0,0 @@ - diff --git a/app/templates/partials/header.hbs b/app/templates/partials/header.hbs deleted file mode 100644 index e37bd5b..0000000 --- a/app/templates/partials/header.hbs +++ /dev/null @@ -1,7 +0,0 @@ -
- - - -

Стиль кода Академии HTML

-

github.com/htmlacademy/codeguide

-
diff --git a/app/templates/partials/html/examples/html-attribute-order-example.hbs b/app/templates/partials/html/examples/html-attribute-order-example.hbs deleted file mode 100644 index d11ef6c..0000000 --- a/app/templates/partials/html/examples/html-attribute-order-example.hbs +++ /dev/null @@ -1,5 +0,0 @@ -<a class="element element-big" id="element" href="/" data-name="element">Ссылка</a> - -<input class="form-control" type="text" name="test"> - -<img class="pets-picture" src="cats.jpg" alt="Изображение котиков"> diff --git a/app/templates/partials/html/examples/html-boolean-example.hbs b/app/templates/partials/html/examples/html-boolean-example.hbs deleted file mode 100644 index 5f28e0c..0000000 --- a/app/templates/partials/html/examples/html-boolean-example.hbs +++ /dev/null @@ -1,8 +0,0 @@ -<!-- checked="checked" необязательно --> -<input type="checkbox" required checked> - -<input type="text" disabled> - -<select> - <option value="1" selected>1</option> -</select> diff --git a/app/templates/partials/html/examples/html-doctype-example.hbs b/app/templates/partials/html/examples/html-doctype-example.hbs deleted file mode 100644 index b4109a7..0000000 --- a/app/templates/partials/html/examples/html-doctype-example.hbs +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html lang="ru"> - <head>…</head> - <body>…</body> -</html> diff --git a/app/templates/partials/html/examples/html-encoding-example.hbs b/app/templates/partials/html/examples/html-encoding-example.hbs deleted file mode 100644 index adc5776..0000000 --- a/app/templates/partials/html/examples/html-encoding-example.hbs +++ /dev/null @@ -1,4 +0,0 @@ -<head> - <meta charset="utf-8"> - <title>Заголовок страницы</title> -</head> diff --git a/app/templates/partials/html/examples/html-form-labels-example.hbs b/app/templates/partials/html/examples/html-form-labels-example.hbs deleted file mode 100644 index 14dd64d..0000000 --- a/app/templates/partials/html/examples/html-form-labels-example.hbs +++ /dev/null @@ -1,11 +0,0 @@ -<!-- Хорошо: элемент формы radio связан с подписью через идентификатор --> -<input type="radio" id="choose"> -<label for="choose">Радио кнопка</label> - -<!-- Хорошо: элемент формы radio и подпись обёрнуты в label --> -<label> - <input type="radio"> Радио кнопка -</label> - -<!-- Плохо: подпись не связана с элементом формы --> -<input type="radio" id="choose"> Радио кнопка diff --git a/app/templates/partials/html/examples/html-img-sizes-example.hbs b/app/templates/partials/html/examples/html-img-sizes-example.hbs deleted file mode 100644 index 12e17b8..0000000 --- a/app/templates/partials/html/examples/html-img-sizes-example.hbs +++ /dev/null @@ -1,14 +0,0 @@ -<!-- Хорошо: размеры картинке заданы --> -<div class="logo-area"> - <img src="logo.png" alt="" width="300" height="150"> -</div> - -<!-- Плохо: размеры картинке заданы в px --> -<div class="logo-area"> - <img src="logo.png" alt="" width="300px" height="150px"> -</div> - -<!-- Плохо: размеры картинке не заданы --> -<div class="logo-area"> - <img src="logo.png" alt=""> -</div> diff --git a/app/templates/partials/html/examples/html-js-includes-example.hbs b/app/templates/partials/html/examples/html-js-includes-example.hbs deleted file mode 100644 index ce1c2f0..0000000 --- a/app/templates/partials/html/examples/html-js-includes-example.hbs +++ /dev/null @@ -1,18 +0,0 @@ -<!-- Хорошо: скрипт подключается перед </body> --> -<!DOCTYPE html> -<html lang="ru"> - <head>…</head> - <body> - <!-- Содержимое страницы --> - <script src="app.js"></script> - </body> -</html> - -<!-- Плохо: скрипт подключается в секции <head> --> -<!DOCTYPE html> -<html lang="ru"> - <head> - <script src="app.js"></script> - </head> - <body>…</body> -</html> diff --git a/app/templates/partials/html/examples/html-language-example.hbs b/app/templates/partials/html/examples/html-language-example.hbs deleted file mode 100644 index b4109a7..0000000 --- a/app/templates/partials/html/examples/html-language-example.hbs +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE html> -<html lang="ru"> - <head>…</head> - <body>…</body> -</html> diff --git a/app/templates/partials/html/examples/html-minimal-markup-example.hbs b/app/templates/partials/html/examples/html-minimal-markup-example.hbs deleted file mode 100644 index 3728ee5..0000000 --- a/app/templates/partials/html/examples/html-minimal-markup-example.hbs +++ /dev/null @@ -1,18 +0,0 @@ -<!-- Хорошо: не используется лишняя обертка, а для декоративного элемента нет дополнительного блока в разметке. --> -<div class="features clearfix"> - <div class="features-item"> - <h2>Быстро</h2> - <p>Мы делаем свою работу быстро!</p> - </div> -</div> - -<!-- Плохо: используется лишняя обертка, которую можно сократить, а для декоративного элемента использован тег <i>, который можно заменить на псевдоэлемент. --> -<div class="features"> - <div class="clearfix"> - <div class="features-item"> - <h2>Быстро</h2> - <i class="triangle"></i> - <p>Мы делаем свою работу быстро!</p> - </div> - </div> -</div> diff --git a/app/templates/partials/html/examples/html-protocol-example.hbs b/app/templates/partials/html/examples/html-protocol-example.hbs deleted file mode 100644 index 9200582..0000000 --- a/app/templates/partials/html/examples/html-protocol-example.hbs +++ /dev/null @@ -1,6 +0,0 @@ -<!-- Нормально --> -<img src="http://www.google.ru/images/srpr/logo11w.png" alt=""> -<img src="https://www.google.ru/images/srpr/logo11w.png" alt=""> - -<!-- Лучше --> -<img src="//www.google.ru/images/srpr/logo11w.png" alt=""> diff --git a/app/templates/partials/html/examples/html-semantics-example.hbs b/app/templates/partials/html/examples/html-semantics-example.hbs deleted file mode 100644 index 7f54bf7..0000000 --- a/app/templates/partials/html/examples/html-semantics-example.hbs +++ /dev/null @@ -1,21 +0,0 @@ -<!-- Хорошо --> -<main> - <article> - <header> - <h1>Пост в блоге</h1> - <p>Опубликовано: <time datetime="2015-02-21">21 февраля, 2015</time></p> - </header> - <p>…</p> - </article> -</main> - -<!-- Плохо --> -<div id="main"> - <div class="article"> - <div class="header"> - <h1>Пост в блоге</h1> - <p>Опубликовано: <span>21 февраля, 2015</span></p> - </div> - <p>…</p> - </div> -</div> diff --git a/app/templates/partials/html/examples/html-style-includes-example.hbs b/app/templates/partials/html/examples/html-style-includes-example.hbs deleted file mode 100644 index 1a684af..0000000 --- a/app/templates/partials/html/examples/html-style-includes-example.hbs +++ /dev/null @@ -1,17 +0,0 @@ -<!-- Хорошо: стилевой файл подключён в секции head --> -<!DOCTYPE html> -<html lang="ru"> - <head> - <link rel="stylesheet" href="style.css"> - </head> - <body>…</body> -</html> - -<!-- Плохо: стилевой файл подключён в секции body --> -<!DOCTYPE html> -<html lang="ru"> - <head>…</head> - <body> - <link rel="stylesheet" href="style.css"> - </body> -</html> diff --git a/app/templates/partials/html/examples/html-syntax-example.hbs b/app/templates/partials/html/examples/html-syntax-example.hbs deleted file mode 100644 index 9595758..0000000 --- a/app/templates/partials/html/examples/html-syntax-example.hbs +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<html lang="ru"> - <head> - <meta charset="utf-8"> - <title>Страница о коте</title> - </head> - <body> - <article class="post"> - <h1>Красивый кот</h1> - <figure class="post-item"> - <img src="cat.jpg" alt="Изображение кота"> - <figcaption>Кот красив!</figcaption> - </figure> - </article> - </body> -</html> diff --git a/app/templates/partials/html/html-recomendations.hbs b/app/templates/partials/html/html-recomendations.hbs deleted file mode 100644 index 9b83e0e..0000000 --- a/app/templates/partials/html/html-recomendations.hbs +++ /dev/null @@ -1,38 +0,0 @@ -
-
- {{~> html/recomendations/html-minimal-markup ~}} -
-
-
-

-        {{~> html/examples/html-minimal-markup-example ~}}
-      
-
-
-
- -
-
- {{~> html/recomendations/html-semantics ~}} -
-
-
-

-        {{~> html/examples/html-semantics-example ~}}
-      
-
-
-
- -
-
- {{~> html/recomendations/html-protocol ~}} -
-
-
-

-        {{~> html/examples/html-protocol-example ~}}
-      
-
-
-
diff --git a/app/templates/partials/html/html-rules.hbs b/app/templates/partials/html/html-rules.hbs deleted file mode 100644 index 64d938c..0000000 --- a/app/templates/partials/html/html-rules.hbs +++ /dev/null @@ -1,135 +0,0 @@ -
-
- {{~> html/rules/html-syntax ~}} -
-
-
-

-        {{~> html/examples/html-syntax-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-validator ~}} -
-
- -
-
- {{~> html/rules/html-doctype ~}} -
-
-
-

-        {{~> html/examples/html-doctype-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-encoding ~}} -
-
-
-

-        {{~> html/examples/html-encoding-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-style-includes ~}} -
-
-
-

-        {{~> html/examples/html-style-includes-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-js-includes ~}} -
-
-
-

-        {{~> html/examples/html-js-includes-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-attribute-order ~}} -
-
-
-

-        {{~> html/examples/html-attribute-order-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-boolean ~}} -
-
-
-

-        {{~> html/examples/html-boolean-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-form-labels ~}} -
-
-
-

-        {{~> html/examples/html-form-labels-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-img-sizes ~}} -
-
-
-

-        {{~> html/examples/html-img-sizes-example ~}}
-      
-
-
-
- -
-
- {{~> html/rules/html-language ~}} -
-
-
-

-        {{~> html/examples/html-language-example ~}}
-      
-
-
-
diff --git a/app/templates/partials/html/recomendations/html-minimal-markup.hbs b/app/templates/partials/html/recomendations/html-minimal-markup.hbs deleted file mode 100644 index ee684e6..0000000 --- a/app/templates/partials/html/recomendations/html-minimal-markup.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Минималистичность разметки

-

- В разметке должно быть использовано минимальное возможное количество элементов. Не должно быть лишних оберток и блоков, которые используются для оформления и могут быть заменены на псевдоэлементы. -

diff --git a/app/templates/partials/html/recomendations/html-protocol.hbs b/app/templates/partials/html/recomendations/html-protocol.hbs deleted file mode 100644 index e9ca3bd..0000000 --- a/app/templates/partials/html/recomendations/html-protocol.hbs +++ /dev/null @@ -1,7 +0,0 @@ -

Протокол ресурса

-

- Если сайт поддерживает оба протокола http: и https:, то при запросе файлов в HTML через полный URL часть с протоколом из адреса можно исключить. Это сделает URL относительным и избавит от проблем с доступом, а также немного сократит запись. -

-

- Если сайт подерживает только один из протоколов, в URL лучше явно указывать соответствующий. -

diff --git a/app/templates/partials/html/recomendations/html-semantics.hbs b/app/templates/partials/html/recomendations/html-semantics.hbs deleted file mode 100644 index 01bbd18..0000000 --- a/app/templates/partials/html/recomendations/html-semantics.hbs +++ /dev/null @@ -1,7 +0,0 @@ -

Семантическая разметка

-

- В разметке должны использоваться семантические теги HTML. -

-

- Параграфы текста должны помещаться в тег <p>. Тег <br> должен применяться по назначению. -

diff --git a/app/templates/partials/html/rules/html-attribute-order.hbs b/app/templates/partials/html/rules/html-attribute-order.hbs deleted file mode 100644 index 76c3817..0000000 --- a/app/templates/partials/html/rules/html-attribute-order.hbs +++ /dev/null @@ -1,7 +0,0 @@ -

Порядок атрибутов

-

- Атрибут класса у HTML-элементов пишется первым. Единообразное написание помогает легче считывать код и быстрее разбираться в назначении блоков по их классам. -

-

- Остальные атрибуты могут быть расставлены в любом порядке, но тоже единообразно для одинаковых элементов. -

diff --git a/app/templates/partials/html/rules/html-boolean.hbs b/app/templates/partials/html/rules/html-boolean.hbs deleted file mode 100644 index 06a16a5..0000000 --- a/app/templates/partials/html/rules/html-boolean.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Логические атрибуты

-

- Для логических атрибутов (например, checked, disabled, required) значение не указывается, а сами атрибуты указываются последними и в единообразной последовательности во всём документе. -

diff --git a/app/templates/partials/html/rules/html-doctype.hbs b/app/templates/partials/html/rules/html-doctype.hbs deleted file mode 100644 index 7fd774d..0000000 --- a/app/templates/partials/html/rules/html-doctype.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

HTML-доктайп

-

- В начале страницы обязательно должен быть указан актуальный doctype, чтобы браузер отображал её в режиме соответствия стандартам. Это гарантирует, что страница будет выглядеть единообразно во всех современных браузерах. -

diff --git a/app/templates/partials/html/rules/html-encoding.hbs b/app/templates/partials/html/rules/html-encoding.hbs deleted file mode 100644 index 003e0e3..0000000 --- a/app/templates/partials/html/rules/html-encoding.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Кодировка символов

-

- Кодировка символов на странице всегда должна быть явно указана, чтобы обеспечить корректное отображение текста. Кодировка utf-8 предпочтительна. -

diff --git a/app/templates/partials/html/rules/html-form-labels.hbs b/app/templates/partials/html/rules/html-form-labels.hbs deleted file mode 100644 index 9a0266c..0000000 --- a/app/templates/partials/html/rules/html-form-labels.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Подписи полей ввода

-

- Для улучшения взаимодействия пользователя с элементами форм, при нажатии на подпись поля, оно должно активироваться. Для этого элемент формы связывается с его описанием с помощью идентификатора и атрибута for тега <label>. -

diff --git a/app/templates/partials/html/rules/html-img-sizes.hbs b/app/templates/partials/html/rules/html-img-sizes.hbs deleted file mode 100644 index 81166e5..0000000 --- a/app/templates/partials/html/rules/html-img-sizes.hbs +++ /dev/null @@ -1,7 +0,0 @@ -

Размеры картинок

-

- Изображениям <img> должны быть явно заданы с помощью атрибута размеры в пикселях или в процентах. В случае пикселей размерность не нужна. -

-

- По возможности изображениям указываются действительные размеры, так как это улучшает производительность отрисовки страницы: браузер не будет перерисовывать страницу в процессе загрузки и отображения изображения. -

diff --git a/app/templates/partials/html/rules/html-js-includes.hbs b/app/templates/partials/html/rules/html-js-includes.hbs deleted file mode 100644 index 30d2050..0000000 --- a/app/templates/partials/html/rules/html-js-includes.hbs +++ /dev/null @@ -1,7 +0,0 @@ -

Подключение скриптов

-

- Скрипты должны подключаться в самом низу страницы, чтобы при её загрузке не блокировать отображение содержимого. -

-

- При подключении скриптов в теге <script> атрибут type не указывается, так как его значение text/javascript устанавливается по умолчанию. -

diff --git a/app/templates/partials/html/rules/html-language.hbs b/app/templates/partials/html/rules/html-language.hbs deleted file mode 100644 index 3c10753..0000000 --- a/app/templates/partials/html/rules/html-language.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Атрибут языка

-

- Для элемента <html> в атрибуте lang должен указываться соответствующий язык документа. Это помогает инструментам синтеза речи определить, какое использовать произношение или системам перевода, какие использовать языковые правила. -

diff --git a/app/templates/partials/html/rules/html-style-includes.hbs b/app/templates/partials/html/rules/html-style-includes.hbs deleted file mode 100644 index 3f0626c..0000000 --- a/app/templates/partials/html/rules/html-style-includes.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Подключение стилей

-

- Стилевые файлы с помощью <link> подключаются внутри <head>. При этом атрибут type для тега <link> не указывается, так как его значение text/css устанавливается по умолчанию. -

diff --git a/app/templates/partials/html/rules/html-syntax.hbs b/app/templates/partials/html/rules/html-syntax.hbs deleted file mode 100644 index c1fb4db..0000000 --- a/app/templates/partials/html/rules/html-syntax.hbs +++ /dev/null @@ -1,8 +0,0 @@ -

Синтаксис

- diff --git a/app/templates/partials/html/rules/html-validator.hbs b/app/templates/partials/html/rules/html-validator.hbs deleted file mode 100644 index ab89317..0000000 --- a/app/templates/partials/html/rules/html-validator.hbs +++ /dev/null @@ -1,4 +0,0 @@ -

Валидность

-

- Документ должен проходить проверку на валидность. Для проверки используется современный валидатор. -

diff --git a/browserslist b/browserslist deleted file mode 100644 index 076e30c..0000000 --- a/browserslist +++ /dev/null @@ -1,15 +0,0 @@ -# Browsers that we support - -# Desktop browsers -Explorer >= 11 -Edge >= 12 -Safari >= 8 -last 4 Chrome versions -last 4 Firefox versions -last 4 Opera versions - -# Mobile browsers -iOS >= 8 -Android >= 4.4 -ExplorerMobile >= 11 -BlackBerry >= 10 diff --git a/config/kit.json b/config/kit.json deleted file mode 100644 index febe63c..0000000 --- a/config/kit.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "entry": { - "css": [ - "style.css" - ], - - "js": [ - "app.js" - ] - }, - - "discover": ["img", "css", "js"], - - "cssnext": { - "browsers": "last 2 versions", - "import": false, - "features": { - "customProperties": false, - "rem": false - } - } -} diff --git a/config/webpack.config.js b/config/webpack.config.js deleted file mode 100644 index a53c00d..0000000 --- a/config/webpack.config.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -const path = require('path'); -const webpack = require('webpack'); -const options = require(path.resolve('config/kit')); - -let files = {}; -options.entry.js.forEach(function(file) { - files[path.basename(file, '.js')] = './js/' + file; -}); - -module.exports = { - context: path.resolve('app'), - - entry: files, - - output: { - path: path.resolve('build/js'), - filename: '[name].js', - pathinfo: true - }, - - module: { - loaders: [{ - test: /\.js$/, - exclude: /node_modules|build/, - loader: 'babel-loader', - query: { - cacheDirectory: true - } - }] - }, - - plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), - new webpack.optimize.DedupePlugin(), - new webpack.optimize.UglifyJsPlugin({ - compress: { - warnings: false - }, - output: { - comments: false - } - }) - ] -}; diff --git a/css/normalize.css b/css/normalize.css new file mode 100644 index 0000000..b26c100 --- /dev/null +++ b/css/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + margin: 0; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/css/prism.css b/css/prism.css new file mode 100644 index 0000000..91c4996 --- /dev/null +++ b/css/prism.css @@ -0,0 +1,139 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..81e0f90 --- /dev/null +++ b/css/style.css @@ -0,0 +1,340 @@ +html { + font-size: 16px; +} + +body { + margin: 0; + + font: 17px/1.6 "Helvetica", "Arial", sans-serif; + color: #5a5a5a; + + background-color: #ffffff; +} + +a:link, +a:visited { + color: #5a5a5a; + text-decoration: underline; +} + +a:hover { + text-decoration: none; +} + +h1, +h2, +h3 { + margin: 0; + + font-weight: normal; + color: #424242; + letter-spacing: -0.025em; +} + +h2, +h3, +h4 { + line-height: 1.2; +} + +h1 { + font-size: 3rem; + line-height: 1.3; +} + +h2 { + font-size: 2.5rem; +} + +h3 { + font-size: 1.75rem; +} + +code, +pre { + font-family: "Consolas", "Liberation Mono", "Menlo", "Courier", monospace; +} + +code { + padding: 2px 4px; + + font-size: 95%; + color: #d44950; + + background-color: #f7f7f9; + border-radius: 0.2rem; +} + +pre { + display: block; + margin: 0 0 1rem; + + line-height: 1.4; + white-space: pre-wrap; +} + +pre code { + padding: 0; + + color: inherit; + + background-color: transparent; + border: 0; +} + +ul li { + margin-bottom: 0.25rem; +} + +header { + padding: 1rem 1rem 6rem; + + text-align: center; + + background-color: #312785; + background-image: repeating-linear-gradient(150deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.06) 1px, transparent 0, transparent 41px), repeating-linear-gradient(-150deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.06) 1px, transparent 0, transparent 41px); + background-size: 82px 47px; +} + +header h1 { + margin: 0 0 0.25rem; + + color: #ffffff; +} + +header p { + margin-top: 0; + + font-size: 1.1rem; +} + +header a:link, +header a:visited { + color: #ffffff; +} + +.visually-hidden { + position: absolute; + + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + + border: 0; + + clip: rect(0, 0, 0, 0); + clip-path: inset(100%); +} + +.logo-list { + max-width: 550px; + margin: 50px auto; +} + +.logo-list ul { + display: flex; + justify-content: space-between; + margin: 0; + padding: 0; + + list-style: none; +} + +.logo { + width: 300px; + height: 300px; +} + +.chapter h2 { + padding: 2rem 1rem; + + background-color: #e5e5e5; +} + +.chapter-part { + display: flex; + flex-direction: column; + + border-bottom: 1px solid #e5e5e5; +} + +.chapter-part-col { + padding: 2rem 1rem; +} + +.chapter-part-col figure { + margin: 0 1rem 0 0; +} + +.chapter-part-col p { + max-width: 32rem; +} + +.chapter-part-col + .chapter-part-col { + border-top: 1px solid #e5e5e5; +} + +.gray-bgcolor { + background-color: #fafafa; +} + +footer { + padding: 2rem; + + background-color: #2d2d44; +} + +.contacts { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.logo-full { + display: inline-block; + width: 161px; +} + +.social-icons { + display: flex; + justify-content: space-between; + align-items: center; + margin: 0.5rem 0 1rem 0; +} + +.social-icons, +.github { + font-size: 0; +} + +.icon { + min-width: 2rem; + min-height: 2rem; + + background-repeat: no-repeat; + background-position: center; + background-size: calc(100% - 5px); + opacity: 0.5; +} + +.icon:hover { + opacity: 1; +} + +.icon-vk { + background-image: url("../img/icon-vkontakte.svg"); +} + +.icon-fb { + background-image: url("../img/icon-facebook.svg"); +} + +.icon-tw { + background-image: url("../img/icon-twitter.svg"); +} + +.icon-ig { + background-image: url("../img/icon-instagram.svg"); +} + +.github-link { + display: inline-block; + width: 91px; + height: 16px; + + background-image: url("../img/github.svg"); +} + +@media (min-width: 38em) { + header { + padding-bottom: 4rem; + } + + html { + font-size: 20px; + } + + .chapter h2 { + padding: 2rem 2rem 2.5rem; + } + + .chapter-part-col { + padding: 2rem; + } +} + +@media (min-width: 48em) { + .chapter h2 { + padding: 2rem 3rem 2.5rem; + } + + .chapter-part { + flex-direction: row; + } + + .chapter-part-col { + width: 50%; + padding: 3rem; + } + + .chapter-part-col--full-width { + width: 100%; + } + + .chapter-part-col + .chapter-part-col { + border-top: 0; + } +} + +/* override default prism theme */ +code[class*="language-"], +pre[class*="language-"] { + white-space: pre-wrap; +} + +pre[class*="language-"] { + margin: 0; + padding: 0; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: initial; +} + +/* override default prism theme */ +code[class*="language-"], +pre[class*="language-"] { + white-space: pre-wrap; +} + +pre[class*="language-"] { + margin: 0; + padding: 0; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: initial; +} + +pre.language-correct, +pre.language-incorrect { + padding: 5px 10px; +} + +pre.language-correct { + background: #deeede; +} + +pre.language-incorrect { + background: #f4d3d3; +} + +pre.language-correct .token.operator, +pre.language-incorrect .token.operator { + background: none; +} diff --git a/gulp/copy.js b/gulp/copy.js deleted file mode 100644 index a0eeb66..0000000 --- a/gulp/copy.js +++ /dev/null @@ -1,11 +0,0 @@ -import fs from 'fs-extra'; -import gulp from 'gulp'; - -let files = 'app/!(css|js|templates)/**/*'; - -gulp.task('clean', fs.emptyDir.bind(null, 'build')); - -gulp.task('copy', gulp.series('clean', () => { - return gulp.src(files, {dot: true}) - .pipe(gulp.dest('build')); -})); diff --git a/gulp/handlebars.js b/gulp/handlebars.js deleted file mode 100644 index 674658a..0000000 --- a/gulp/handlebars.js +++ /dev/null @@ -1,28 +0,0 @@ -import fs from 'fs-extra'; -import merge from 'merge'; -import gulp from 'gulp'; -import rename from 'gulp-rename'; -import engine from 'gulp-compile-handlebars'; -import {get as bs} from 'browser-sync'; - -const configure = () => { - fs.ensureDirSync('./app/templates/partials'); - fs.ensureDirSync('./app/templates/helpers'); - - return { - ignorePartials: true, - batch: ['./app/templates/partials'], - helpers: merge( - require('hbs-helpers'), - require('require-dir')('./../app/templates/helpers') - ) - }; -}; - -gulp.task('handlebars', () => { - return gulp.src('app/templates/*.hbs') - .pipe(engine({}, configure())) - .pipe(rename({extname: '.html'})) - .pipe(gulp.dest('build')) - .pipe(bs('kit').stream()); -}); diff --git a/gulp/postcss.js b/gulp/postcss.js deleted file mode 100644 index fb6a3f4..0000000 --- a/gulp/postcss.js +++ /dev/null @@ -1,40 +0,0 @@ -import path from 'path'; -import gulp from 'gulp'; -import postcss from 'gulp-postcss'; -import minify from 'gulp-minify-css'; -import {get as bs} from 'browser-sync'; - -import include from 'postcss-import'; -import mixins from 'postcss-mixins'; -import nested from 'postcss-nested'; -import variables from 'postcss-css-variables'; -import cssnext from 'postcss-cssnext'; -import assets from 'postcss-assets'; -import mqpacker from 'css-mqpacker'; - -const options = require(path.resolve('config/kit')); - -let files = options.entry.css.map((file) => path.join('app', 'css', file)); - -let plugins = [ - include(), - mixins(), - nested(), - variables(), - cssnext(options.cssnext), - assets({ - loadPaths: options.discover, - basePath: 'build/' - }), - mqpacker({ - sort: true - }) -]; - -gulp.task('postcss', () => { - return gulp.src(files, {base: 'app', allowEmpty: true, sourcemaps: true}) - .pipe(postcss(plugins)) - .pipe(minify({keepSpecialComments: 0})) - .pipe(gulp.dest('build', {sourcemaps: {path: '.'}})) - .pipe(bs('kit').stream({match: '**/*.css'})); -}); diff --git a/gulp/serve.js b/gulp/serve.js deleted file mode 100644 index 482d87b..0000000 --- a/gulp/serve.js +++ /dev/null @@ -1,32 +0,0 @@ -import gulp from 'gulp'; - -const bs = require('browser-sync').create('kit'); - -gulp.task('serve', () => { - bs.init({ - server: 'build/', - notify: false, - open: false, - ui: false - }); - - gulp.watch( - 'app/css/**/*.css', - gulp.series('postcss') - ); - - gulp.watch( - 'app/js/**/*.js', - gulp.series('webpack') - ); - - gulp.watch( - 'app/templates/**/*.{hbs,js}', - gulp.series('handlebars') - ); - - gulp.watch( - 'app/img/**/*.{jpg,png,svg,gif}', - gulp.series('handlebars') - ); -}); diff --git a/gulp/webpack.js b/gulp/webpack.js deleted file mode 100644 index bcf9639..0000000 --- a/gulp/webpack.js +++ /dev/null @@ -1,17 +0,0 @@ -import path from 'path'; -import gulp from 'gulp'; -import webpack from 'webpack-stream'; -import {get as bs} from 'browser-sync'; - -gulp.task('webpack', () => { - let options = require(path.resolve('config/webpack.config')); - - options.devtool = 'source-map'; - options.debug = true; - options.cache = true; - - return gulp.src('app/js/app.js', {allowEmpty: true}) - .pipe(webpack(options)) - .pipe(gulp.dest('build/js')) - .pipe(bs('kit').stream({match: '**/*.js'})); -}); diff --git a/gulpfile.babel.js b/gulpfile.babel.js deleted file mode 100644 index d475fa4..0000000 --- a/gulpfile.babel.js +++ /dev/null @@ -1,10 +0,0 @@ -import gulp from 'gulp'; - -require('require-dir')('./gulp'); - -gulp.task('start', gulp.series( - 'copy', - gulp.parallel('postcss', 'webpack'), - 'handlebars', - 'serve' -)); diff --git a/html-css.html b/html-css.html new file mode 100644 index 0000000..a1a3684 --- /dev/null +++ b/html-css.html @@ -0,0 +1,572 @@ + + + + + Стиль кода Академии HTML + + + + + + + + + + + + + + + + + +
+ + + +

Стиль кода Академии HTML

+

github.com/htmlacademy/codeguide

+
+ +
+
+

Оглавление

+
+ + +
+
+ +
+

HTML

+ +
+
+

Синтаксис

+
    +
  • Для отступов у вложенных элементов используются два пробела. Для правильного форматирования используйте файл .editorconfig в вашем редакторе.
  • +
  • Теги и их атрибуты пишутся строчными буквами. Для значений атрибутов всегда используются двойные кавычки.
  • +
  • Необязательный закрывающий слеш у одиночных тегов (<img>, <br> и другие) не ставится.
  • +
  • Необязательные закрывающие теги (например, </li> или </body>) не пропускаются.
  • +
  • Для проверки HTML-кода используйте файл конфигурации .htmlhintrc для настройки валидатора HTMLHint.
  • +
+
+
+
+
<!DOCTYPE html>
+<html lang="ru">
+  <head>
+    <meta charset="utf-8">
+    <title>Страница о коте</title>
+  </head>
+  <body>
+    <article class="post">
+      <h1>Красивый кот</h1>
+      <figure class="post-item">
+        <img src="cat.jpg" alt="Изображение кота">
+        <figcaption>Кот красив!</figcaption>
+      </figure>
+    </article>
+  </body>
+</html>
+
+
+
+ +
+
+

Валидность

+

+ Документ должен проходить проверку на валидность. Для проверки используется современный валидатор. +

+
+
+ +
+
+

HTML-доктайп

+

+ В начале страницы обязательно должен быть указан актуальный doctype, чтобы браузер отображал её в режиме соответствия стандартам. Это гарантирует, что страница будет выглядеть единообразно во всех современных браузерах. +

+
+
+
+
<!DOCTYPE html>
+<html lang="ru">
+  <head>…</head>
+  <body>…</body>
+</html>
+
+
+
+ +
+
+

Кодировка символов

+

+ Кодировка символов на странице всегда должна быть явно указана, чтобы обеспечить корректное отображение текста. Кодировка utf-8 предпочтительна. +

+
+
+
+
<head>
+  <meta charset="utf-8">
+  <title>Заголовок страницы</title>
+</head>
+
+
+
+ +
+
+

Подключение стилей

+

+ Стилевые файлы с помощью <link> подключаются внутри <head>. При этом атрибут type для тега <link> не указывается, так как его значение text/css устанавливается по умолчанию. +

+
+
+
+
<!-- Хорошо: стилевой файл подключён в секции head -->
+<!DOCTYPE html>
+<html lang="ru">
+  <head>
+    <link rel="stylesheet" href="style.css">
+  </head>
+  <body>…</body>
+</html>
+
+<!-- Плохо: стилевой файл подключён в секции body -->
+<!DOCTYPE html>
+<html lang="ru">
+  <head>…</head>
+  <body>
+    <link rel="stylesheet" href="style.css">
+  </body>
+</html>
+
+
+
+ +
+
+

Подключение скриптов

+

+ Скрипты должны подключаться в самом низу страницы, чтобы при её загрузке не блокировать отображение содержимого. +

+

+ При подключении скриптов в теге <script> атрибут type не указывается, так как его значение text/javascript устанавливается по умолчанию. +

+
+
+
+
<!-- Хорошо: скрипт подключается перед </body> -->
+<!DOCTYPE html>
+<html lang="ru">
+  <head>…</head>
+  <body>
+    <!-- Содержимое страницы -->
+    <script src="app.js"></script>
+  </body>
+</html>
+
+<!-- Плохо: скрипт подключается в секции <head> -->
+<!DOCTYPE html>
+<html lang="ru">
+  <head>
+    <script src="app.js"></script>
+  </head>
+  <body>…</body>
+</html>
+
+
+
+ +
+
+

Порядок атрибутов

+

+ Атрибут класса у HTML-элементов пишется первым. Единообразное написание помогает легче считывать код и быстрее разбираться в назначении блоков по их классам. +

+

+ Остальные атрибуты могут быть расставлены в любом порядке, но тоже единообразно для одинаковых элементов. +

+
+
+
+
<a class="element element-big" id="element" href="/" data-name="element">Ссылка</a>
+
+<input class="form-control" type="text" name="test">
+
+<img class="pets-picture" src="cats.jpg" alt="Изображение котиков">
+
+
+
+ +
+
+

Логические атрибуты

+

+ Для логических атрибутов (например, checked, disabled, required) значение не указывается, а сами атрибуты указываются последними и в единообразной последовательности во всём документе. +

+
+
+
+
<!-- checked="checked" необязательно -->
+<input type="checkbox" required checked>
+
+<input type="text" disabled>
+
+<select>
+  <option value="1" selected>1</option>
+</select>
+
+
+
+ +
+
+

Подписи полей ввода

+

+ Для улучшения взаимодействия пользователя с элементами форм, при нажатии на подпись поля, оно должно активироваться. Для этого элемент формы связывается с его описанием с помощью идентификатора и атрибута for тега <label>. +

+
+
+
+
<!-- Хорошо: элемент формы radio связан с подписью через идентификатор -->
+<input type="radio" id="choose">
+<label for="choose">Радио кнопка</label>
+
+<!-- Хорошо: элемент формы radio и подпись обёрнуты в label -->
+<label>
+  <input type="radio"> Радио кнопка
+</label>
+
+<!-- Плохо: подпись не связана с элементом формы -->
+<input type="radio" id="choose"> Радио кнопка
+
+
+
+ +
+
+

Размеры картинок

+

+ Изображениям <img> должны быть явно заданы с помощью атрибута размеры в пикселях. В случае пикселей размерность не нужна. +

+

+ По возможности изображениям указываются действительные размеры, так как это улучшает производительность отрисовки страницы: браузер не будет перерисовывать страницу в процессе загрузки и отображения изображения. +

+
+
+
+
<!-- Хорошо: размеры картинке заданы -->
+<div class="logo-area">
+  <img src="logo.png" alt="" width="300" height="150">
+</div>
+
+<!-- Плохо: размеры картинке заданы в px -->
+<div class="logo-area">
+  <img src="logo.png" alt="" width="300px" height="150px">
+</div>
+
+<!-- Плохо: размеры картинке не заданы -->
+<div class="logo-area">
+  <img src="logo.png" alt="">
+</div>
+
+
+
+ +
+
+

Атрибут языка

+

+ Для элемента <html> в атрибуте lang должен указываться соответствующий язык документа. Это помогает инструментам синтеза речи определить, какое использовать произношение или системам перевода, какие использовать языковые правила. +

+
+
+
+
<!DOCTYPE html>
+<html lang="ru">
+  <head>…</head>
+  <body>…</body>
+</html>
+
+
+
+
+ +
+

CSS

+ +
+
+

Синтаксис

+
    +
  • После значения свойства обязательно ставится точка с запятой.
  • +
  • Для отступов внутри правил используются два пробела. Для правильного форматирования используйте файл .editorconfig в вашем редакторе.
  • +
  • Шестнадцатеричное значение цвета не сокращается, а пишется полностью из всех шести символов. Для записи используются строчные буквы. Например, #f5f5f5.
  • +
  • Названия тегов и свойств в правилах пишутся строчными буквами.
  • +
  • Начальный ноль для значений не сокращается (например, .5 вместо 0.5).
  • +
  • Во всех случаях в стилях используются двойные кавычки. В необязательных случаях кавычки не опускаются.
  • +
  • После двоеточия в правилах ставится один пробел (top: 10px;). А перед двоеточием пробел не нужен.
  • +
  • После запятых внутри значений rgb(), rgba(), hsl(), hsla() или rect() пробелы ставятся. Это повышает удобочитаемость.
  • +
  • До и после комбинатора между селекторами (например, p > a) ставится один пробел.
  • +
  • Каждое объявление в правиле пишется на новой строке.
  • +
  • Перед открывающейся фигурной скобкой ставится один пробел. После скобки запись идёт с новой строки: +
    .selector {
    +  color: #f5f5f5;
    +}
    +            
  • +
  • Закрывающая фигурная скобка пишется на новой строке и без отступа. Следующее после этого правило отделяется пустой строкой.
  • +
  • Единицы измерения не пишутся, там где в них нет необходимости. Например, border: 0.
  • +
  • Для проверки CSS-кода используйте файл конфигурации .stylelintrc для настройки валидатора stylelint.
  • +
  • Для автоматического применения этих правил используйте файл конфигурации csscomb.json для настройки CSSComb.
  • +
+
+
+
+
/* Хорошо */
+.selector,
+.selector-secondary,
+.selector[type="text"] {
+  padding: 15px;
+  margin-bottom: 15px;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 1px 2px #cccccc, inset 0 1px 0 #ffffff;
+}
+
+/* Плохо */
+.selector, .selector-secondary, .selector[type=text]{
+  padding:15px;
+  margin:0px 0px 15px;
+  background-color:rgba(0,0,0,.5);
+  box-shadow:0px 1px 2px #CCC,inset 0 1px 0 #FFFFFF}
+
+
+
+ +
+
+

Порядок свойств

+

+ Объявления логически связанных свойств группируются в следующем порядке: +

+
    +
  1. Позиционирование
  2. +
  3. Блочная модель
  4. +
  5. Типографика
  6. +
  7. Оформление
  8. +
  9. Анимация
  10. +
  11. Разное
  12. +
+

+ Позиционирование следует первым потому, что оно влияет на положение блоков в потоке документа. Блочная модель идёт следующей, так как она определяет размеры и расположение блоков. +

+

+ Все остальные объявления, которые изменяют вид внутренних частей блоков и не оказывают влияния на другие блоки, идут в последнюю очередь. +

+

+ Сгруппированные объявления в правиле отделяются друг от друга пустой строкой. +

+

+ Порядок объявления подробных правил, таких как font-size, font-family, line-height, должен соответствовать порядку в сокращённой версии правила. В случае совместного использования подробных и сокращённых правил, первой должна идти сокращённая версия. +

+
+
+
+
.declaration-order {
+  /* Позиционирование */
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 100;
+
+  /* Блочная модель */
+  display: block;
+  float: right;
+  width: 100px;
+  height: 100px;
+  margin: 10px;
+  padding: 10px;
+
+  /* Типографика */
+  font: normal 13px/1.5 "Arial", sans-serif;
+  font-style: normal;
+  font-size: 13px;
+  line-height: 1.5;
+  font-family: "Arial", sans-serif;
+  text-align: center;
+  color: #333333;
+
+  /* Оформление */
+  background-color: #f5f5f5;
+  border: 1px solid #e5e5e5;
+  border-radius: 3px;
+  opacity: 1;
+
+  /* Анимация */
+  transition: color 1s;
+
+  /* Разное */
+  will-change: auto;
+}
+
+
+
+ +
+
+

Имена классов

+
    +
  • Имена классов пишутся строчными буквами, используется дефис (но не знаки нижнего подчёркивания или camelCase). Дефисы служат разделителями во взаимосвязанных классах (например, .button и .button-danger).
  • +
  • Имена классов должны быть такими, чтобы по ним можно было быстро понять какому элементу страницы задан класс: избегайте сокращений (единственное исключение — .btn для кнопок), но не делайте их слишком длинными (более трёх слов).
  • +
  • Для написания классов используются английские слова и термины. Транслитом названия классов и атрибутов не пишутся.
  • +
+
+
+
+
/* Хорошо */
+.alert-danger { … }
+.tweet .user-picture { … }
+.button { … }
+.layout-center { … }
+
+/* Плохо */
+.testElement { … }
+.t { … }
+.big_red_button { … }
+.knopka { … }
+
+
+
+ +
+
+

Правило @import

+

+ Правило @import работает медленнее, чем тег <link>. В стилях @import не должен использоваться. +

+
+
+
+
<!-- Хорошо: подключение тегом link -->
+<link rel="stylesheet" href="module.css">
+
+<!-- Плохо -->
+<style>
+  @import url("module.css");
+</style>
+
+
+
+ +
+
+

Варианты шрифта

+

+ Альтернативные варианты шрифта и тип семейства указываются в конце перечисления font-family. +

+

+ В случае использования нестандартных шрифтов альтернативный веб-безопасный шрифт и тип семейства указываются, чтобы в случае отсутствия нестандартного шрифта в системе, изменения внешнего вида страницы были минимальны. Альтернативный шрифт должен быть такого же типа, что и нестандартный. +

+

+ Порядок шрифтов следующий: +

+
    +
  1. нестандартный шрифт;
  2. +
  3. веб-безопасный;
  4. +
  5. тип шрифта.
  6. +
+

+ Список веб-безопасных шрифтов можно посмотреть здесь — cssfontstack.com. +

+
+
+
+
/* Хорошо: указан альтернативный веб-безопасный шрифт и его тип семейства */
+body {
+  font-family: "Helvetica", "Arial", sans-serif;
+}
+
+/* Кому-то нравится Arial, кому-то Tahoma */
+body {
+  font-family: "Helvetica", "Tahoma", sans-serif;
+}
+
+/* Плохо: указан только нестандартный шрифт */
+body {
+  font-family: "Helvetica";
+}
+
+/* Плохо: указан только нестандартный шрифт и тип семейства, альтернативный веб-безопасный шрифт отсутствует */
+body {
+  font-family: "Helvetica", sans-serif;
+}
+
+/* Плохо: Georgia — шрифт с засечками, а нестандартный шрифт — без засечек */
+body {
+  font-family: "Helvetica", "Georgia", sans-serif;
+}
+
+
+
+
+
+ + + + + + diff --git a/img/bane.svg b/img/bane.svg new file mode 100644 index 0000000..5c5cae4 --- /dev/null +++ b/img/bane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/github.svg b/img/github.svg new file mode 100644 index 0000000..9ffd39e --- /dev/null +++ b/img/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/img/icon-facebook.svg b/img/icon-facebook.svg similarity index 100% rename from app/img/icon-facebook.svg rename to img/icon-facebook.svg diff --git a/app/img/icon-instagram.svg b/img/icon-instagram.svg similarity index 100% rename from app/img/icon-instagram.svg rename to img/icon-instagram.svg diff --git a/app/img/icon-twitter.svg b/img/icon-twitter.svg similarity index 100% rename from app/img/icon-twitter.svg rename to img/icon-twitter.svg diff --git a/app/img/icon-vkontakte.svg b/img/icon-vkontakte.svg similarity index 100% rename from app/img/icon-vkontakte.svg rename to img/icon-vkontakte.svg diff --git a/app/img/logo-full.svg b/img/logo-full.svg similarity index 83% rename from app/img/logo-full.svg rename to img/logo-full.svg index 7319e8a..d61fc5e 100644 --- a/app/img/logo-full.svg +++ b/img/logo-full.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/img/logo-html.svg b/img/logo-html.svg new file mode 100644 index 0000000..101e1ff --- /dev/null +++ b/img/logo-html.svg @@ -0,0 +1 @@ +HTML5 Logo diff --git a/img/logo-js.svg b/img/logo-js.svg new file mode 100644 index 0000000..d609063 --- /dev/null +++ b/img/logo-js.svg @@ -0,0 +1 @@ + diff --git a/app/img/logo.svg b/img/logo.svg similarity index 100% rename from app/img/logo.svg rename to img/logo.svg diff --git a/app/img/og.png b/img/og.png similarity index 100% rename from app/img/og.png rename to img/og.png diff --git a/index.html b/index.html new file mode 100644 index 0000000..b3dbc00 --- /dev/null +++ b/index.html @@ -0,0 +1,79 @@ + + + + + Стиль кода Академии HTML + + + + + + + + + + + + + + + + + +
+ + + +

Стиль кода Академии HTML

+

github.com/htmlacademy/codeguide

+
+ +
+ +
+ + + + diff --git a/javascript.html b/javascript.html new file mode 100644 index 0000000..6015c57 --- /dev/null +++ b/javascript.html @@ -0,0 +1,593 @@ + + + + + Стиль кода Академии HTML + + + + + + + + + + + + + + + + + + + +
+ + + +

Стиль кода Академии HTML

+

github.com/htmlacademy/codeguide

+
+ +
+
+

Синтаксис

+ +
+
+

Отступы, пробелы и переносы

+ +
Для правильного форматирования используйте файл .editorconfig в вашем редакторе.
+ +

Для отступов используются два пробела. Знак табуляции не используется.

+ +

При переносах в продолжении строки используется четыре пробела

+ +

Запрещено одновременное использование табов и пробелов для отступов

+ +

Выражения должны заканчиваться точками с запятой

+ +

Для отступов ключевых слов, операторов и т. д. используется не более одного пробела

+
var name       = 1;
+var longerName = 2;
+
+ +
var name = 1;
+var longerName = 2;
+
+ +

Открывающие скобки блоков кода находятся на одной строке с оператором, которых их использует: +

if (condition)
+{
+  // code
+}
+
+ +
if (condition) {
+  // code
+}
+
+

+ +

В однострочных блоках кода, код отделен от открывающей и закрывающей скобки пробелом

+ +

В однострочных массивах скобки не отделяются пробелами, первое значение идет непосредственно после закрывающей скобки, а закрывающая скобка идет непосредственно после последнего значения массива

+ +

После запятой всегда должен ставиться пробел, если запятая не в конце строки

+ +

Запрещено переносить запятую на новую строку при создании множественных переменных через один var, при объявлении массивов и объектов. Запрещено использовать запятую в конце списков, объектов или наоборов параметров функции

+ +

Файл должен заканчиваться пустой строкой

+ +

Строка не должна заканчиваться пробелами

+ +

В однострочных объектах и при деструктуризации фигурные скобки отбиваются пробелами с двух сторон

+ +

В коде не используются совместно табы и пробелы

+ +

Блоки кода отделяются друг от друга не более чем двумя пустыми строками

+ +

В качестве символа переноса строки используется стандартный символ, который используется в системе

+ +

При объявлении вычисляемых ключей в объектах с помощью синтаксиса ES2016 в квадратных скобках не используются пробелы

+ +

Оператор вызова функции () не отделяется круглыми скобками от названия функции

+ +

В объектах после объявления ключа не ставится пробел. После двоеточия, которое отделяет в объектах ключ от значения может стоять только один пробел, выравнивать несколько значений при объявлении многострочного объекта запрещено

+ +

Ключевые слова отделяются пробелами. Правило касается всех блоков, которые не оговорены отдельно в других правилах. В частности ключевые слова должны отделяться пробелами для условных операторов, циклов, операторов множественного выбора, блоков try..catch, объявлений классов и т. д.

+ +

В блоках кода первая и последняя строка не должны быть пустыми (код не отбивается от начала блока кода)

+ +

После двоеточий и точек с запятым ставятся пробелы. Перед ними — не ставятся

+ +

Перед скобками начинающими новый блок кода должен ставиться пробел

+ +

При объявлении анонимных функций, скобки с параметрами отделаются пробелом от ключевого слова function. Если функция именована, перед названием ставится пробел, после — нет

+ +

В комментариях текст отбивается пробелом от начала комментария

+ +

При создании генераторов, звездочка идет сразу после ключевого слова function без пробелов

+ +

В spread-операторе точки не отделяются от названия коллекции

+ +

Звездочка после ключевого слова yield не отбивается пробелом. После звездочки пробел ставится всегда

+
+
+ +
+
+

Строки

+

В строках, объявленных с помощью одинарных и двойных кавычек запрещено использовать переносы

+ +

В строках запрещено указывать код спецсимволов в восьмеричной системе счисления +

var foo = "Copyright \251";
+
+ +
var foo = "Copyright \u00A9";
+
+

+ +

При создании объектов через литералы свойства должны объявляться в едином стиле: или без кавычек или с ними

+ +

В строках используются одинарные кавычки. Разрешено использовать строковые шаблоны. Если позволяет поддержка, предпочтение отдается строковым шаблонам

+
+
+ +
+
+

Числа

+

В числах запрещено опускать ноль в дробной и целой части

+ +

Запрещено использовать ведущий ноль при создании чисел, поскольку это приводит к созданию числа в восьмеричной системе счисления

+
+
+ +
+
+

Литералы

+

Массивы должны создаваться через литерал массива, а не через конструктор. Допустимое исключение — создание массива определенной длины

+ +

Объекты должны создаваться через литерал объекта, а не через конструктор

+ +

При создании объектов запрещено дублирование ключей

+ +

При описании функций запрещено дублировать названия параметров

+ +

В операторе switch запрещено дублировать условия (case)

+
+
+ +
+
+

Операторы

+

В бинарных и тернарных операторах операнды и символы оператора отделяются пробелами

+ +

Унарные операторы не отделяются от операнда пробелом. Исключения составляют операторы, состоящие из слов, а не символов, например оператор typeof

+
+
+ +
+ +
+

Именование

+ +
+
+

Запрещено объявлять переменные, имена которых совпадают с именами используемых в коде лейблов

+ +

Все переменные должны быть названы в верблюжьем регистре (camelCase). Исключения составляют константы которые должны именоваться прописными буквами в змеином регистре (UPPER_SNAKE_CASE)

+ +

Запрещено использовать имена переменных, которые используются во внешних областях видимости

+ +

Запрещено называть переменные и свойства ключевыми словами JS

+ +

Запрещено использовать переменные, не объявленные ранее. При использовании переменной, объявленной в другом модуле в глобальной области видимости нужно обращаться к ней как в свойству объекта window/global

+ +

Запрещено объявлять переменные без значения

+ +

Запрещено напрямую обращаться к значению undefined. Для проверки типа рекомендуется использовать typeof. Для прямого сравнения с undefined можно использовать конструкцию void 0

+ +

С заглавной буквы называются только функции-конструкторы

+
+
+ +
+ +
+

Предотвращение ошибок

+ +
+
+

Все точки с запятой должны быть проставлены явно, не стоит рассчитывать на автоматическую расстановку точек с запятой ASI (Automatic Semicolon Insertion)

+ +

Не рекомендуется использовать указатель Unicode BOM в коде, потому что код должен быть сохранен не в кодировке UTF-16, а в кодировке UTF-8, в которой нет указателя порядка бит

+ +

Обязательно используются блоки кода даже если в выражении содержится одна строчка

+ +

В коде нет пустых блоков кода

+ +

Код работает в строгом режиме: в начале всех файлов явно прописана директива 'use strict'

+
+
+ +
+
+

Условные операторы

+

Запрещена «проверка Йоды» — в условных операторах в блоке условия при сравнении переменной или свойства со значением сначала идет переменная или свойство объекта и только потом значения, а не наоброт. +

if (1 === myValue) {}
+
+ +
if (myValue === 1) {}
+

+ +

При сравнении двух значений используется оператор строгого сравнения вместо оператора нестрогого сравнения

+ +

В условных операторах не используется оператор присвоения

+ +

В условиях не используется небезопасное отрицание, например использование ! в in или instanceof без скобок

+ +

Запрещено сравнение с NaN. Для проверки, является результат операции числовым, нужно использовать Number.isNaN

+ +

Запрещено использовать case без break или return в блоках switch

+ +

Не используются вложенные тернарные операторы

+
+
+ +
+
+

Функции

+

Если в функции используется ветвление, в котором есть возврат значения (return), return должен быть добавлен и в остальных ветках.

+ +
var do = function() {
+  if (cond) {
+    return 1;
+  } else {
+    doSomethingElse();
+  }
+};
+
+ +
var do = function() {
+  if (cond) {
+    return 1;
+  } else {
+    return 2;
+  }
+};
+
+ +

Это правило предотвращает создание функций, при использовании которых непонятно, вернут ли они какое-то значение. В первом примере, функция do может вернуть значение 1, а может undefined

+ +

В return не используется оператор присваивания

+ +

В стрелочных функциях всегда используются скобки для параметров, даже если параметр один

+
+
+ +
+
+

Операторы

+

В конструкторе классов-наследников обязательно вызывается super()

+ +

В конструкторе нет обращения к this до того, как будет вызван super()

+
+
+ +
+
+

Объявление переменных и функций

+

При объявлении переменных предпочтение отдается ключевым словам let и const. Переменные объявляются через var только при наличии проблем с поддержкой кода

+ +

Запрещено переопределять с помощью ключевого слова ранее созданные переменные

+ +

Запрещено использовать множественное объявление через одно ключевое слово. Для каждой переменной используется отдельный var, let или const. +

var a = 1, b = 2;
+
+ +
var a = 1;
+var b = 2;
+
+

+ +

Объявление функций

+

Запрещено переопределение функций, созданных с помощью функционального объявления (function declaration) +

function myFunc() {};
+myFunc = 2;
+

+ +

Запрещено объявление значений внутри блоков

+ +

Новые функции не создаются с помощью конструктора Function

+ +

Вместо коллекции arguments, используется rest-оператор, если это позволяет версия языка

+ +

Вместо вызова функции через apply используется spread-оператор, если это позволяет версия языка + +

Math.max.apply(null, [1, 100, 15, 1000]);
+
+ +
Math.max(...[1, 100, 15, 1000]);
+
+

+ +

Создание значений

+

Не вызываются служебные конструкторы, создающие объекты из глобальной области видимости Math(), JSON(), Reflect()

+ +

При создании непустых массивов запрещено опускать пустые значения (ставить подряд несколько запятых)

+ +

При создании непустых объектов и массивов не используются «висячие» запятые

+ +

Не используются конструкторы примитивов, которые используются для автобоксинга String, Number, Boolean

+ +

Конструкторы вызываются со скобками, даже если у них нет параметров

+ +

Символы (Symbol) создаются вызовом функции Symbol без ключевого слова new

+
+
+ +
+
+

Хорошие практики

+

Не используется конструкция with

+ +

Не используются alert

+ +

Не используется выполнение кода через eval

+ +

Не используется неявный eval — в функциях, которые поддерживают передачу исполняемого кода как строку, например setTimeout

+ +

В ссылках используется протокол javascript:

+ +

Конструкторы не используются без ключевого слова new

+ +

В функциях не используются обращения к caller и callee

+ +

Манкипатчинг

+ +

Встроенные в язык объекты и прототипы не расширяются в рантайме

+ +

Не переопределяются глобальные значения (undefined, null, Object, window и прочие)

+ +

Контекст

+

bind не используется вне методов классов

+ +

В функциях, которые не являются методами никакого объекта или класса не используется this

+ +

Переменные

+

Переменные, объявленные через var не удаляются оператором delete

+
+
+ +
+
+

Приведение типов

+

Не используется лишнее приведение к Boolean. Например, нет большого смысла переводить в boolean условия в конструкциях if, while, for, в первом операнде тернарного оператора

+ +

Оператор typeof используется корректно — используются только правильные значения, возвращаемые оператором, не производится сравнения со строковыми литералами, которые содержат некорректные значения typeof

+ +

В parseInt обязательно передается второй параметр — основание системы счисления, даже в случае с десятичной системой счисления

+ +

Константы в условиях

+ +

В блоки условия операторов if, while, for и тернарного оператора не передается константное значение, которое подразумевает, что условие выполняется (или не выполняется) всегда +

if (true) {}
+
+ +
if (a > 1) {}
+
+ +
var ternaryValue = true ? 'a' : 'b';
+
+ +
var ternaryValue = isA() ? 'a' : 'b';
+
+

+
+
+ +
+ +
+

Чистый код

+ +
+
+

Лишние символы

+

Не используются лишние (множественные) точки с запятой

+
+
+ +
+
+

Отладчик и консоль

+

В коде не используется оставленных выводов в консоль

+ +

В коде нет забытых инструкций debugger

+
+
+ +
+
+

Неиспользуемый код

+

В проекте нет недоступного кода, который никогда не выполнится + +

if (false) {
+  doSomething();
+}
+
+ +
if (needToDoSomething()) {
+  doSomething();
+}
+
+

+ +

В коде нет объявленных, но неиспользуемых переменных

+ +

В коде нет выражений, значения которых не записываются в переменные, параметры функций, свойства объектов и не передаются как параметры функций + +

check === true && doSomething();
+
+ +
if (check) {
+  doSomething();
+}
+
+

+
+
+ +
+
+

Обработка ошибок и исключения

+

Для выбрасывания исключения в оператор throw передаются только объекты Error. Передавать литералы запрещено. + +

throw 'Passed value is out of range';
+
+ +
throw new RangeError('Rassed value is out of range');
+

+ +

В конструкции try..catch запрещен пустой блок catch

+
+
+ +
+ +
+

Документирование

+ +
+
+ При написании jsDoc используются следующие ограничения: + +

необязательно добавлять текстовое описание конструкциям @return и @param, достаточно просто указания типа и названия параметра для @param

+ +

описание возвращаемного типа @return требуется только в том случае, если функция возвращает какое-то значение. Правило не действует для конструкторов, для них указывать @return необязательно. Также необязательно указывать тег @return для функций, в которых конструкуия return используется без возвращаемого значения для выхода из функции

+ +

для описания возвращаемого значения из функции используется тег @return, а не @returns

+
+
+ +
+ +
+

Прочее

+ +
+
+

При итерировании по объектам через for..in при работе со свойствами используется конструкция hasOwnProperty

+ +

В объектах напрямую не переопределяется свойство __iterator__

+ +

В объектах напрямую не переопределяется свойство __proto__. Разрешено переопределять __proto__ через Object.create или запись в прототип, объектов, созданных другими конструкторами, но напрямую редактировать __proto__ нельзя +

var obj = {
+  __proto__: Parent
+};
+
+ +
var Obj = function() {};
+Obj.prototype = new Parent();
+var obj = new obj;
+
+var obj = Object.create(Parent.prototype);
+
+

+ +

В коде не используются лейблы. Лейблы используются с конструкциями break и continue для направленного выхода из икла и могут привести к слишком сложному для понимания коду

+ +

Блоки, использующиеся в коде должны описывать тело функции, условия, оператора switch и прочие конструкции относящиеся к группировке множественных операций. Блоки не должны использваться сами по себе, любой блок должен быть частью другого выражения

+ +

В коде не используется оператор «запятая» для описания последовательностей действий. Для создания переменных используются отдельные ключевые слова let, const, var, в операторы группировки, условные операторы и прочие конструкции. Исключение составляет начальное условие оператора for +

const result = (1, 2); // 2
+
+ +
const result = 2;
+
+
+
switch (val = getVal(), val) {}
+
+ +
val = getVal();
+switch(val) {}
+
+for (var i = 0, l = 100; i < l; i++);
+
+

+
+
+ +
+
+

Регулярные выражения

+

В регулярных выражениях не используются «управляющие выражения»

+ +

В регулярных выражениях не используются пустые классы символов [] (блоки, ограниченные квадратными скобками)

+ +

В коде регулярные выражения не создаются через конструктор RegExp из строки, которая не может быть разобрана как правильное регулярное выражение

+ +

В регулярных выражениях не используются нескольких последовательных пробелов. Вместо этого предлагается использовать модификаторы количества + +

/   /.exec(myString);
+
+ +
/\s\s\s/.exec(myString);
+
+ +
/\s{3}/.exec(myString);
+
+

+
+
+ +
+
+

Node.js

+ +

В Node.js файлах не используется конструкция process.exit

+
+
+ +
+ +
+ + + + + + diff --git a/js/prism.js b/js/prism.js new file mode 100644 index 0000000..8d62d4e --- /dev/null +++ b/js/prism.js @@ -0,0 +1,6 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(v instanceof a)){u.lastIndex=0;var b=u.exec(v),k=1;if(!b&&h&&m!=r.length-1){if(u.lastIndex=y,b=u.exec(e),!b)break;for(var w=b.index+(c?b[1].length:0),_=b.index+b[0].length,P=m,A=y,j=r.length;j>P&&_>A;++P)A+=r[P].length,w>=A&&(++m,y=A);if(r[m]instanceof a||r[P-1].greedy)continue;k=P-m,v=e.slice(y,A),b.index-=y}if(b){c&&(f=b[1].length);var w=b.index+f,b=b[0].slice(f),_=w+b.length,x=v.slice(0,w),O=v.slice(_),S=[m,k];x&&S.push(x);var N=new a(i,g?n.tokenize(b,g):b,d,b,h);S.push(N),O&&S.push(O),Array.prototype.splice.apply(r,S)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var l={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if("comment"==l.type&&(l.attributes.spellcheck="true"),e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+""},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,!document.addEventListener||n.manual||r.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; +Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:{pattern:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\w\W]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*\*?|\/|~|\^|%|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\\\|\\?[^\\])*?`/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript; diff --git a/md/syntax.md b/md/syntax.md new file mode 100644 index 0000000..ab1bdd7 --- /dev/null +++ b/md/syntax.md @@ -0,0 +1,218 @@ +# Стиль кода JS + +## Форматирование +### Строка не должна быть длиннее 80 символов +Строки более 80 символов длиной, снижают скорость чтения заставляя читатаеля +перемещать глаза на большое расстояние. + +Не стоит забывать и о том, что код, написанный в Академии часто показывается +в разного рода презентациях, что увеличивает требования к читаемости кода + +### Выравнивание знаков равенства запрещено +Трудоемкий и очень хрупкий процесс. Если хотя бы одна из переменных + +### Перенос строк +#### Блоки кода отделяются двумя пробелами +Код внутри блока отбивается двумя пробелами относительно начала блока. +Правило работает даже внутри кода с другим отступом. +```diff ++ function factorial(number) { ++ if (number === 1 || number === 0) { ++ return 1; ++ } ++ ++ return number * factorial(number - 1); ++ } +``` + +```diff ++ document.querySelectorAll('button'). ++ addEventListener('click', function(evt) { ++ // Используются два пробела, потому что отступ делается ++ // внутри тела функции, хоть она и является неперенесенным ++ // аргументом при вызове addEventListener. ++ evt.preventDefault(); ++ ga._trackEvent('click', evt.target.innerText); ++ }, true); +``` + +#### Аргументы функций и вызовы через цепчку отделяются четырьмя пробелами +При переносе длинных вызовов функции и обращении к свойствам через точку +по длинной цепочке, при переносе используются четыре пробела. Меньшее количество +пробелов сделает отступ неотличимым при быстром чтении кода от отступа +у вложенного блока. + +```diff ++ +``` + +#### Альтернативный способ переносить аргументы — выравнивать их с открывающей скобкой +В определенных случаях аргументы функции можно выравнивать вместе +с открывающей скобкой вызова функции. Это можно делать в случае, +если названия аргументов достаточно длинные. + +Такой же перенос можно использовать в проверке условий (`if`, `while`). + +```diff ++ while (footer.getBoundingClientRect().top - window.innerHeight > 0 && ++ currentPageNumber < itemsToShow) { ++ displayNextPage(); ++ } +``` + +_В обоих случаях при переносе аргументов функции, закрывающая скобка +при вызове остается на последней строке._ + +#### Объявление объектов и массивов +При многострочном объявлении массивов и объектов, используется два пробела +и закрывающая скобка ставится на отдельную строку. +```diff ++ var AvailableDirection = [ ++ Direction.TOP, ++ Direction.LEFT, ++ Direction.RIGHT ++ ]; +``` + +#### В многострочных операциях, операторы ставятся в конце строки, а не в начале +При переносе длинных вызовов (чейны, объявление массивов и объектов, функции +с большим количеством аргументов, тернарные операторы) операторы остаются +на предыдущей строке. + +Правила с переносом оператора хорошо работают в языках, где необязательно +удалять забытые запятые в конце спиков. Но даже в этом случае быстрое удаление +и сортировка строк не будут работать, потому у списков будет отличаться первая +строка, а у чейнов — последняя и после сортировки и удаления нужно перепроверить +получившийся список на валидность. + +```diff ++ document.body. ++ querySelectorAll('div'). ++ quertSelectorAll('span'); + +- document.body +- .querySelectorAll('div') +- .quertSelectorAll('span'); +``` + +```diff ++ var Direction = { ++ TOP: 0x01, ++ BOTTOM: 0x02, ++ LEFT: 0x04, ++ RIGHT: 0x08 ++ }; + +- var Direction = { +- TOP: 0x01 +- ,BOTTOM: 0x02 +- ,LEFT: 0x04 +- ,RIGHT: 0x08 +- }; +``` + +```diff ++ var AvailableDirection = [ ++ Direction.TOP, ++ Direction.LEFT, ++ Direction.RIGHT ++ ]; + +- var AvailableDirection = [ +- Direction.TOP +- ,Direction.LEFT +- ,Direction.RIGHT +- ]; +``` + +Если примеры с объявлением массивов и объектов или с цепочкой вызовов +объясняются логически, то перенос разделителей в тернарном операторе +не имеет никакого смысла + +```diff +- var element = 'content' in document.createElement('template') +- ? template.content.children[0].cloneNode(true) +- : template.children[0].cloneNode(true); + ++ var element = 'content' in document.createElement('template') ? ++ template.content.children[0].cloneNode(true) : ++ template.chilren[0].cloneNode(true); +``` + +## Правила языка +В каждом файле нужно использовать директиву `'use strict'` для включения +интерпретатора в строгий режим исполнения JavaScript. + +### Каждая переменная объявляется через свой var +Один var для нескольких переменных является одним шагом исполнения, поэтому +проходится как интерпретатором, так и отладчиком как единственная инструкция, +даже если объявленных переменных несколько. В этом случае проблемной становится +отладка программы, если в одной из объявленных переменных допущена ошибка + +```diff +- var container = document.querySelector('.container'), +- buttons = container.querySelectorAll('button'), +- panels = container.querySelectorAll('.panel'); + ++ var container = document.querySelector('.container'); ++ var buttons = container.querySelectorAll('button'); ++ var panels = container.querySelectorAll('.panel'); +``` + +### Функции объявляются как переменные +Функции должны объявляться как переменные. Особенности «подвешивания» функций +позволяют их использовать до того как они были объявлены. Зачастую функция +объявляется в локальной области видимости и в этом случае ее объявление +не должно затрагивать всю область видимости. + +Положительный побочный эффект такого стиля заключается в том, +что при использовании его в обучающем процессе идея коллбэков объясняется +сильно проще + +```diff +- function onAnimationEnd(callback) { +- if (isExecuting) { +- function callbackToQueue() { +- callback(); +- queue.splice(queue.indexOf(callbackToQueue), 1); +- } +- +- queue.push(callbackToQueue); +- } else { +- callback(); +- } +- } + ++ var onAnimationEnd = function(callback) { ++ if (isExecuting) { ++ var callbackToQueue = function() { // Совсем хорошо, если let ++ callback(); ++ queue.splice(queue.indexOf(callbackToQueue), 1); ++ } ++ ++ queue.push(callbackToQueue); ++ } else { ++ callback(); ++ } ++ } +``` + +### Замыкания +```diff +- function onItemClick(item, i) { +- item.onClick = function() { +- var clickedItem = i; +- }; +- } + ++ function onItemClick(item, i) { ++ item.click = getClickHandler(i); ++ } ++ ++ function getClickHandler(i) { ++ var clickedItem = i; ++ } +``` diff --git a/package.json b/package.json deleted file mode 100644 index 4da81de..0000000 --- a/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "htmlacademy--codeguide", - "version": "0.1.0", - "private": true, - "dependencies": { - "normalize.css": "^4.1.1", - "prismjs": "^1.4.1", - "prismjs-default-theme": "0.0.1" - }, - "devDependencies": { - "babel-core": "^6.1.2", - "babel-loader": "^6.1.0", - "babel-preset-es2015": "^6.1.2", - "browser-sync": "^2.10.0", - "css-mqpacker": "^4.0.0", - "eslint": "^1.9.0", - "fs-extra": "^0.26.2", - "gulp": "gulpjs/gulp#4.0", - "gulp-compile-handlebars": "^0.5.0", - "gulp-minify-css": "^1.2.1", - "gulp-postcss": "^6.0.1", - "gulp-rename": "^1.2.2", - "hbs-helpers": "^1.0.3", - "husky": "^0.10.1", - "merge": "^1.2.0", - "node-libs-browser": "^0.5.3", - "postcss-assets": "^3.0.2", - "postcss-css-variables": "^0.5.1", - "postcss-cssnext": "^2.2.0", - "postcss-import": "^7.1.3", - "postcss-mixins": "^2.1.1", - "postcss-nested": "^1.0.0", - "require-dir": "^0.3.0", - "webpack": "^1.12.4", - "webpack-stream": "^2.1.1" - }, - "scripts": { - "build": "gulp build", - "dev": "gulp start", - "start": "npm run dev", - "lint": "eslint .", - "prepush": "npm run lint", - "test": "npm run lint" - }, - "engines": { - "node": ">=0.12" - }, - "license": "MIT" -}