npm i goodt-framework-css --save
npm i less --save-dev
npm i less-loader --save-dev
// ваш <enty-point>.js
import 'goodt-framework-css/src/_all.less'
npm run build
.src/
components/... |
набор компонентов |
_all.less |
точка входа, собирает все части фреймворка воедино |
_helpers.less |
набор вспомогательных примесей |
_params.less |
основные параметры всего фреймворка, используются всеми частями фреймворка |
grid.less |
отзывчивая flex сетка 5%, 1/12, 1/24 |
typography.less |
базовые стили, типографика |
utility.less |
набор вспомогательных классов "утилит" |
Компонент условно делится на три части
[1] параметры |
параметры, которые использует компонент |
[2] хуки |
встроенные в стили компонента хуки, которые позволяют внедрять кастомный стиль в то или иное правило компонента |
[3] стиль |
стиль компонента, описывающий внешний вид компонента, используя параметры и
хуки |
components/example.less
// [1] параметры, которые использует компонент
@example-font-size: .8rem;
@example-line-height: 1.5;
@example-padding: @spacer3 @spacer4;
@example-color: @color-white;
@example-background: @color-body;
// [2] хук, вызываемый в стиле компонента; позволяет переопределить стиль компонента
.hook-example() {}
// [3] стиль
.example {
position: relative;
display: inline-block;
vertical-align: middle;
padding: @example-padding; // <-- использование параметров [1]
color: @example-color;
font-size: @example-font-size;
line-height: @example-line-height;
background: @example-background;
.hook-example(); // <-- вставка хука [2]
}
_all.less
в свой
.less
файл, далее можно уже переопределить любой параметр фреймворка в тч элементов
или компонентов; или переопределить стили используя хуки.my-theme.less
// импорт фреймворка
@import './<путь>/_all.less';
// переопределяем базовые параметры, используемые всеми частями фреймворка из ~ params.less
@font-family: Helvetica, Arial, sans-serif;
@font-family-headings: Helvetica, Arial, sans-serif;
@font-size: 16px;
// переопределяем параметры конкретного компонента ~ components/toast.less
@toast-font-size: 1rem;
// используем хук компонента ~ toast.less
.hook-toast() {
display: inline-flex; // <-- переопределяет "display", который изначально в компоненте "inline-block"
}
padding
и margin
@spacer
и @spacer-layout
.
Отступы расчитываются от базового значения 16px
название | значение | итог |
---|---|---|
@spacer1 |
0.125 |
2px |
@spacer2 |
0.25 |
4px |
@spacer3 |
0.5 |
8px |
@spacer4 |
0.75 |
12px |
@spacer5 |
1 |
16px |
@spacer6 |
1.5 |
24px |
@spacer7 |
2 |
32px |
@spacer8 |
2 |
40px |
@spacer9 |
2 |
48px |
@layout-spacer1 |
1 |
16px |
@layout-spacer2 |
1.5 |
24px |
@layout-spacer3 |
2 |
32px |
@layout-spacer4 |
3 |
48px |
@layout-spacer5 |
4 |
64px |
@layout-spacer6 |
6 |
96px |
@layout-spacer7 |
10 |
160px |
{viewport}
.
.{viewport}-{classname}
// например
.s-text-small
// где
// {viewport} — s
// {classname} — text-small
{viewport}
в кастомных компонентах или классах
используйте less хелпер .media
@import './<путь>/_helpers.less'
// пример использования .media хелпера
.my-class {
font-size: 1rem;
}
.media(@viewport-s, .my-class {
font-size: .9rem;
})
{viewport}
; ниже показан их список.less переменная | название {viewport} |
ширина экрана | приоритет |
---|---|---|---|
— | — | ∞ | самый низкий |
@viewport-xl |
xl | 0 - 1280px | отменяет default |
@viewport-l |
l | 0 - 1024px | отменяет xl default |
@viewport-m |
m | 0 - 840px | отменяет l xl default |
@viewport-s |
s | 0 - 640px | отменяет m l xl default |
:root
)
css переменная | значение |
---|---|
{{item.name}}
|
{{item.value}} {{item.value}} ~ {{calcRelUnit(item.value)}} |
переменная | значение |
---|---|
@{{varName}}
|
{{varValue.value}}
{{varValue.value}}
~ {{calcRelUnit(varValue.value)}}
|
переменная | значение |
---|---|
@{{varName}}
|
{{varValue.value}}
{{varValue.value}}
~ {{calcRelUnit(varValue.value)}}
|
// ваш <enty-point>.js
import 'goodt-framework-css/fonts/regular/pt-root-ui-regular.css';
import 'goodt-framework-css/fonts/bold/pt-root-ui-bold.css';
код | результат |
---|---|
<h1> .h1 |
h1 |
<h2> .h2 |
h2 |
<h3> .h3 |
h3 |
<h4> .h4 |
h4 |
.text-large .text-lead |
text-large
|
.text-small |
text-small
|
.text-xsmall |
text-xsmall
|
<p> .p |
Lorem ipsum dolor sit amet consectetur adipisicing elit. Natus, vel. |
<blockquote> |
Lorem ipsum dolor sit amet consectetur. |
<pre> .pre |
Lorem ipsum dolor sit amet consectetur. |
<s> <del> .del |
Lorem ipsum dolor sit amet consectetur adipisicing elit. Natus,
vel.
|
<sup> .sup |
Lorem ipsum |
<sub> .sub |
Lorem ipsum |
<mark> .mark |
Lorem ipsum |
<code> .code |
Lorem ipsum |
|
|
|
|
|
|
<table>
, что позволяет использовать
таблицы с стандартными стилями, наряду с фреймворком..table
Класс | Описание |
---|---|
.w-{size} |
может применятся для элементов <th> <td> ,
задает ширину столбца; подробнее см. Width
утилиты |
.table-w-auto |
может применятся для элементов <th> <td> ,
задает минимальную ширину колонки, подстраиваясь под ширину ее контента; схоже с
тем, как работает утилита .w-auto на других элементах |
top
..table-vtop
.table-vmid
.table-vbot
.table-vbase
.table-borders
.table-zebra
.table-hover
.row
. По умолчанию, строки задают отступы для колонок
по вертикали и горизонтали..row-collapse
.col
. Колонки должны быть непосредственными дочерними
элементами строки .row
..col-vtop
.col-vmid
.col-vbot
.col-auto
задает колонку, которая старается занять как можно
меньше места по ширине, подстраиваясь под ее контент (режим shrink).col-{size}
, где
{size}
зависит от выбранной системы (см. таблицу ниже).Система | Описание | {size} |
---|---|---|
5% |
сетка задается в %, изменяется от 5% - 100% с шагом в 5% (так же включает спец. размеры 33%, 66%) | 5 10 15 ... 100 33
66 |
1/12 |
сетка задается дробью, изменяется от 1/12 - 12/12 с шагом 1/12 | 1-12 2-12 ... 12-12 |
1/24 |
сетка задается дробью, изменяется от 1/24 - 12/24 с шагом 1/24 | 1-24 2-24 ... 24-24 |
.{viewport}-col-{size}
.{viewport} |
название viewport |
{size} |
размер колонки, в зависимости от выбранной вами системы |
.row-gap-{1-9}
или .row-gap-l{1-7}
(см. таблицу ниже).Класс | Описание |
---|---|
.row-gap-{1-9} |
применяет горизонтальный и вертикальный gap размером @spacer{1-9} |
.row-gap-l{1-7} |
применяет горизонтальный и вертикальный gap размером @spacer-layout{1-7} |
.row-hgap-{1-9}
или .row-hgap-l{1-7}
(см. таблицу ниже).Класс | Описание |
---|---|
.row-hgap-{1-9} |
применяет gap размером @spacer{1-9} |
.row-hgap-l{1-7} |
применяет gap размером @spacer-layout{1-7} |
.row-vgap-{1-9}
или .row-vgap-l{1-7}
(см. таблицу ниже).Класс | Описание |
---|---|
.row-vgap-{1-9} |
применяет gap размером @spacer{1-9} |
.row-vgap-l{1-7} |
применяет gap размером @spacer-layout{1-7} |
<div class="row row-hgap-{{hgap}} row-vgap-{{vgap}}">...</div>
.push-{size}
, где
{size}
зависит от выбранной системы (см. таблицу ниже).Система | Описание | {size} |
---|---|---|
5% |
сетка задается в %, изменяется от 5% - 100% с шагом в 5% (так же включает спец. размеры 33%, 66%) | 5 10 15 ... 100 33
66 |
1/12 |
сетка задается дробью, изменяется от 1/12 - 12/12 с шагом 1/12 | 1-12 2-12 ... 12-12 |
1/24 |
сетка задается дробью, изменяется от 1/24 - 12/24 с шагом 1/24 | 1-24 2-24 ... 24-24 |
.{viewport}-push-{size}
.{viewport} |
название viewport |
{size} |
размер отступа, в зависимости от выбранной вами системы |
.avatar-{2-7}
.round
(см. Misc утилиты).badge-primary
.badge-success
.badge-warn
.badge-error
.badge-misc
.round
(см. Misc утилиты).dropdown-small
dropdown
имеет ограничение в 5 элементов в списке, после которого
появится прокрутка.dropdown
позволяет интегрировать кастомные dom-элементыcomponents/offcanvas.less
.active
для открытия offcanvas
components/panel.less
components/popup.less
popup
на всю ширину/высоту окна, используйте
класс .popup-fixed
components/shim.less
shim
можно использовать как "ширму" для других компонентов
или элементовshim-overlay
, используйте классы
.bg-{value}
утилитpreloader
.tabs-center
.tabs-right
components/form.less
input
select
textarea
фреймворк использует свои классы. Что изолирует стили и позволяет использовать данные элементы
для кастомной стилизации, если это необходимо.
form-label
, используйте классы
.form-label-xsmall
.form-label-small
.form-label-large
form-label
используйте класс form-label-sticky
form-label-sticky
использует абсолютное позиционирование, вам необходимо использовать контейнер. В качестве контейнера вы можете использовать form-control
.form-label
используйте класс form-label-float
. Работает с элементами .input
.textarea
form-label-float
использует абсолютное позиционирование, вам необходимо использовать контейнер. В качестве контейнера вы можете использовать form-control
.position: relative; display: inline-block;
input
select
form-elem
utility.less
float
.класс | описание | пример |
---|---|---|
responsive
.pull-left .{viewport}-pull-left |
применяет float: left |
lorem ipsum
|
responsive
.pull-right .{viewport}-pull-right |
применяет float: right |
lorem ipsum
|
responsive
.pull-center .{viewport}-pull-center |
применяет float: none; margin: 0 auto; |
lorem ipsum
|
responsive
.pull-none .{viewport}-pull-none |
применяет float: none; margin: 0; |
класс | описание | пример |
---|---|---|
.text-h1 |
применяет font-size элемента <h1> |
Text
|
.text-h2 |
применяет font-size элемента <h2> |
Text
|
.text-h3 |
применяет font-size элемента <h3> |
Text
|
.text-h4 |
применяет font-size элемента <h4> |
Text
|
responsive
.text-large .text-lead .{viewport}-text-large .{viewport}-text-lead |
применяет @font-size*1.125 |
Text
|
responsive
.text-small .{viewport}-text-small |
применяет @font-size*0.875 |
Text
|
responsive
.text-xsmall .{viewport}-text-xsmall |
применяет @font-size*0.75 |
Text
|
.text-left |
применяет text-align: left |
Text
|
.text-right |
применяет text-align: right |
Text
|
.text-center |
применяет text-align: center |
Text
|
.text-justify |
применяет text-align: justify |
Lorem ipsum, dolor sit amet consectetur adipisicing elit.
|
.text-italic |
применяет font-style: italic |
Text
|
.text-bold |
применяет font-weight: bold |
Text
|
.text-normal |
применяет font-weight: normal; font-style: normal |
Text
|
.text-muted |
приглушает текст |
Text
|
.text-truncate |
обрезает длинный текст |
Lorem ipsum dolor sit amet consectetur adipisicing elit.
|
.text-upper |
преобразуем текст в большим буквам |
This text was written in a normal case.
|
.text-nowrap nobr |
применяет white-space: nowrap |
|
.break-word |
разрешает перенос текста по словам | |
.lh-1 |
применяет line-height: 1 |
color
класс | пример |
---|---|
.color-black |
text |
.color-body |
text |
.color-primary |
text |
.color-link |
text |
.color-red .color-invalid .color-required |
text |
.color-green .color-valid |
text |
.color-yellow |
text |
.color-orange |
text |
.color-grey |
text |
.color-grey-dark |
text |
.color-grey-light |
text |
.color-grey-lighter |
text |
.color-muted |
text |
.color-white |
text |
.color-disabled |
text |
.color-disabled-dark |
text |
.color-border |
text |
.color-transparent |
text |
.color-inherit |
text |
background-color
класс | пример |
---|---|
.bg-black |
|
.bg-body |
|
.bg-primary |
|
.bg-link |
|
.bg-red .bg-invalid .bg-required |
|
.bg-green .bg-valid |
|
.bg-yellow |
|
.bg-orange |
|
.bg-grey |
|
.bg-grey-dark |
|
.bg-grey-light |
|
.bg-grey-lighter |
|
.bg-muted |
|
.bg-white |
|
.bg-disabled |
|
.bg-disabled-dark |
|
.bg-border |
|
.bg-transparent |
|
.bg-inherit |
vertical-align
класс | описание |
---|---|
.v-top |
применяет vertical-align: top |
.v-mid |
применяет vertical-align: middle |
.v-bot |
применяет vertical-align: bottom |
.v-base |
применяет vertical-align: baseline |
.v-inherit |
применяет vertical-align: inherit |
padding
класс | описание |
---|---|
.pad-none |
применяет padding: 0 |
.pad-v-none |
применяет padding-top: 0; padding-bottom: 0; |
.pad-h-none |
применяет padding-left: 0; padding-right: 0; |
.pad-left-none |
применяет padding-left: 0 |
.pad-right-none |
применяет padding-right: 0 |
.pad-top-none |
применяет padding-top: 0 |
.pad-bot-none |
применяет padding-bottom: 0 |
.pad-{1-9} |
применяет padding: @spacer{1-9} |
.pad-v-{1-9} |
применяет padding-top: @spacer{1-9}; padding-bottom: @spacer{1-9} |
.pad-h-{1-9} |
применяет padding-left: @spacer{1-9}; padding-right: @spacer{1-9} |
.pad-left-{1-9} |
применяет padding-left: @spacer{1-9} |
.pad-right-{1-9} |
применяет padding-right: @spacer{1-9} |
.pad-top-{1-9} |
применяет padding-top: @spacer{1-9} |
.pad-bot-{1-9} |
применяет padding-bottom: @spacer{1-9} |
.pad-l{1-7} |
применяет padding: @spacer-layout{1-7} |
.pad-v-l{1-7} |
применяет padding-top: @spacer-layout{1-7}; padding-bottom: @spacer-layout{1-7} |
.pad-h-l{1-7} |
применяет padding-left: @spacer-layout{1-7}; padding-right: @spacer-layout{1-7} |
.pad-left-l{1-7} |
применяет padding-left: @spacer-layout{1-7} |
.pad-right-l{1-7} |
применяет padding-right: @spacer-layout{1-7} |
.pad-top-l{1-7} |
применяет padding-top: @spacer-layout{1-7} |
.pad-bot-l{1-7} |
применяет padding-bottom: @spacer-layout{1-7} |
margin
класс | описание |
---|---|
.mar-none |
применяет margin: 0 |
.mar-v-none |
применяет margin-top: 0; margin-bottom: 0 |
.mar-h-none |
применяет margin-left: 0; margin-right: 0 |
.mar-left-none |
применяет margin-left: 0 |
.mar-right-none |
применяет margin-right: 0 |
.mar-top-none |
применяет margin-top: 0 |
.mar-bot-none .last .end |
применяет margin-bottom: 0 |
.mar-auto |
применяет margin: auto |
.mar-v-auto |
применяет margin-top: auto; margin-bottom: auto |
.mar-h-auto |
применяет margin-left: auto; margin-right: auto |
.mar-left-auto |
применяет margin-left: auto |
.mar-right-auto |
применяет margin-right: auto |
.mar-top-auto |
применяет margin-top: auto |
.mar-bot-auto |
применяет margin-bottom: auto |
.mar-{1-9} |
применяет margin: @spacer{1-9} |
.mar-v-{1-9} |
применяет margin-top: @spacer{1-9}; margin-bottom: @spacer{1-9} |
.mar-h-{1-9} |
применяет margin-left: @spacer{1-9}; margin-right: @spacer{1-9} |
.mar-left-{1-9} |
применяет margin-left: @spacer{1-9} |
.mar-right-{1-9} |
применяет margin-right: @spacer{1-9} |
.mar-top-{1-9} |
применяет margin-top: @spacer{1-9} |
.mar-bot-{1-9} |
применяет margin-bottom: @spacer{1-9} |
.mar-l{1-7} |
применяет margin: @spacer-layout{1-7} |
.mar-v-l{1-7} |
применяет margin-top: @spacer-layout{1-7}; margin-bottom: @spacer-layout{1-7} |
.mar-h-l{1-7} |
применяет margin-left: @spacer-layout{1-7}; margin-right: @spacer-layout{1-7} |
.mar-left-l{1-7} |
применяет margin-left: @spacer-layout{1-7} |
.mar-right-l{1-7} |
применяет margin-right: @spacer-layout{1-7} |
.mar-top-l{1-7} |
применяет margin-top: @spacer-layout{1-7} |
.mar-bot-l{1-7} |
применяет margin-bottom: @spacer-layout{1-7} |
display
класс | описание |
---|---|
.d-flex |
применяет display: flex |
.d-inline-flex |
применяет display: inline-flex |
.d-inline-block |
применяет display: inline-block |
.d-inline |
применяет display: inline |
.d-block |
применяет display: block |
responsive
.show .{viewport}-show |
применяет display: block |
responsive
.hide .{viewport}-hide |
применяет display: none |
.invisible |
применяет visibility: hidden |
flex
элементами.класс | описание |
---|---|
.flex-col |
применяет flex-direction: column , применяется к flex элементу
|
.flex-center |
применяет align-items: center и justify-content: center |
.flex-h-center |
применяет горизонтальное выравнивание дочерних элементов по центру
justify-content: center , применяется к flex элементу |
.flex-h-stretch |
применяет justify-content: stretch |
.flex-h-space-between |
применяет justify-content: space-between |
.flex-h-space-evenly |
применяет justify-content: space-evenly |
.flex-h-space-around |
применяет justify-content: space-around |
.flex-h-start |
применяет justify-content: flex-start |
.flex-h-end |
применяет justify-content: flex-end |
.flex-v-center |
применяет вертикальное выравнивание дочерних элементов по центру
align-items: center , применяется к flex элементу |
.flex-v-stretch |
применяет align-items: stretch |
.flex-v-baseline |
применяет align-items: baseline |
.flex-v-space-between |
применяет align-content: space-between |
.flex-v-space-evenly |
применяет align-content: space-evenly |
.flex-v-space-around |
применяет align-content: space-around |
.flex-v-start |
применяет align-content: flex-start |
.flex-v-end |
применяет align-content: flex-end |
.flex-wrap |
применяет flex-wrap: wrap |
.flex-nowrap |
применяет flex-wrap: nowrap |
.flex-grow |
применяет flex-grow: 1 , применяется к дочерним элементам flex
элемента |
.flex-shrink |
применяет flex-shrink: 1 , применяется к дочерним элементам
flex элемента |
position
.класс | описание |
---|---|
.pos-abs |
применяет position: absolute |
.pos-rel |
применяет position: relative |
.pos-fixed |
применяет position: fixed |
.pos-sticky |
применяет position: sticky |
.pos-static |
применяет position: static |
.pos-top-left
.pos-top-center
.pos-top-right
.pos-bot-left
.pos-bot-center
.pos-bot-right
.pos-left-center
.pos-right-center
.pos-center
width
.
класс | описание |
---|---|
responsive
.w-{size} .{viewport}-w-{size} |
применяет ширину {size} , которая зависит от выбранной системы (см.
таблицу ниже) |
Система | Описание | {size} |
---|---|---|
5% |
сетка задается в %, изменяется от 5% - 100% с шагом в 5% (так же включает спец. размеры 33%, 66%) | 5 10 15 ... 100 33
66 |
1/12 |
сетка задается дробью, изменяется от 1/12 - 12/12 с шагом 1/12 | 1-12 2-12 ... 12-12 |
1/24 |
сетка задается дробью, изменяется от 1/24 - 12/24 с шагом 1/24 | 1-24 2-24 ... 24-24 |
viewport | width |
---|---|
* | w-6-12 |
XL | w-8-12 |
L | w-10-12 |
M | w-11-12 |
S | w-12-12 |
.w-f{size}
, где
{size}
принимает значения:{size} | less переменная | ширина (px) |
---|---|---|
1 |
@width-fixed1 |
128 |
2 |
@width-fixed2 |
256 |
3 |
@width-fixed3 |
384 |
4 |
@width-fixed4 |
512 |
5 |
@width-fixed5 |
640 |
6 |
@width-fixed6 |
768 |
7 |
@width-fixed7 |
896 |
.min-w-f{size}
и .max-w-f{size}
, где
{size}
принимает значения по аналогии с .w-f{size}
height
.
класс | описание |
---|---|
.h-auto |
применяет height: auto |
.h-100 |
применяет height: 100% |
.h-100v |
применяет height: 100vh |
.min-h-f{size}
и .max-h-f{size}
, где
{size}
принимает значения по аналогии с .w-f{size}
класс | описание |
---|---|
.section |
применяет отступ margin-bottom: @spacer-layout5 |
.block |
применяет отступ margin-bottom: @spacer-layout3 |
.p |
применяет отступ margin-bottom: @spacer-layout1 |
.container |
контейнер 100% ширины (но не более @container-max-width ), выровненный по
центру |
.cf .clear |
cleafix хак, для устранения проблем с float элементами |
overflow
.класс | описание |
---|---|
.scroll-hide .noscroll |
применяет overflow: hidden |
.scroll-x |
применяет overflow-x: auto |
.scroll-y |
применяет overflow-y: auto |
pointer-events
.класс | описание |
---|---|
.events-none |
применяет pointer-events: none |
.events-all |
применяет pointer-events: all |
cursor
.класс | описание |
---|---|
.cursor-auto |
применяет cursor: auto |
.cursor-default |
применяет cursor: default |
.cursor-pointer |
применяет cursor: pointer |
.cursor-help |
применяет cursor: help |
filter
.класс | описание | пример |
---|---|---|
.filter-blur |
применяет filter: blur(5px) |
|
.filter-grayscale |
применяет filter: grayscale(1) |
|
.filter-invert |
применяет filter: invert(1) |
object-fit
.класс | описание |
---|---|
.obj-contain |
применяет object-fit: contain |
.obj-cover |
применяет object-fit: cover |
класс | описание | пример |
---|---|---|
.thumb .thumbnail |
применяет рамку для предпросмотра | |
.responsive |
задает max-width: 100%; height: auto применимо к <img>
<video> |
|
.round |
полностью закругляет края элемента | |
.radius-none |
убирает закругления краев элемента | |
.radius .radius-{1-5} |
закругляет края элемента, согласно заданным параметрам фреймворка (4px, 8px, 16px, 32px, 64px) | |
.shadow-none |
убирает тень элемента | |
.shadow .shadow-{1-5} |
задает тень элемента, согласно заданным параметрам фреймворка | |
.icon .icon .icon-2 .icon .icon-3 |
спец. flex контейнер для иконок |
|
.close |
close |
|
.link |
ссылка интерактивная (предполагает открытие ui элемента типа popup например) | Lorem ipsum |
.u-select-none .u-select-all .u-select-text |
применяет user-select: none | all | text |
|
.ui-muted |
применяет opacity |
Sample text |
.border-none |
применяет border: none |
.icon
.color-{value}
утилитами (см. Color утилиты Misc утилиты).npm install @mdi/font --save
npm install @mdi/light-font --save
// ваш <entry-point>.js
import '@mdi/font/css/materialdesignicons.min.css';
import '@mdi/light-font/css/materialdesignicons-light.min.css'
Такого раздела пока нет в документации