griffincss-utils 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,125 @@
1
+ // Griffincss — Spacing Utilities
2
+ // Внешние и внутренние отступы. Шаг шкалы — 0.25rem.
3
+ //
4
+ // Шкала разрежена намеренно: мелкий шаг нужен только у малых значений,
5
+ // дальше идут секционные отступы 2.5rem, 3rem и 4rem. Промежуточные величины
6
+ // задаются своим CSS — генерировать 17 ступеней ради трёх используемых незачем.
7
+ //
8
+ // Адаптивность — суффиксом брейкпоинта: .gr-p-4-md. Префиксная форма
9
+ // .gr-md\:p-4 удалена в v0.7.0; в библиотеке остался один синтаксис.
10
+
11
+ @use 'griffincss-core/scss/breakpoints' as bp;
12
+ @use 'griffincss-core/scss/container-mixins' as cq;
13
+
14
+ $gr-spacing-base: 0.25rem !default;
15
+ $gr-spacing-steps: (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 16) !default;
16
+
17
+ // Один и тот же набор правил выводится дважды: без суффикса и внутри
18
+ // каждого медиа-запроса. Миксин держит оба вывода в одном определении —
19
+ // разойтись они не могут.
20
+ @mixin gr-spacing-scale($suffix: '') {
21
+ @each $i in $gr-spacing-steps {
22
+ $val: $i * $gr-spacing-base;
23
+
24
+ .gr-m-#{$i}#{$suffix} { margin: $val; }
25
+
26
+ .gr-p-#{$i}#{$suffix} {
27
+ // Зазор — источник, padding — следствие. Тогда спор .gr-p-* и
28
+ // .gr-radius за padding перестаёт что-либо значить: обе стороны
29
+ // приходят к одному значению. Только равномерный отступ:
30
+ // у осевых и односторонних зазор для каскада не определён.
31
+ --gr-p: #{$val};
32
+
33
+ padding: var(--gr-p);
34
+ }
35
+
36
+
37
+ .gr-mt-#{$i}#{$suffix} { margin-top: $val; }
38
+ .gr-mr-#{$i}#{$suffix} { margin-right: $val; }
39
+ .gr-mb-#{$i}#{$suffix} { margin-bottom: $val; }
40
+ .gr-ml-#{$i}#{$suffix} { margin-left: $val; }
41
+
42
+ .gr-pt-#{$i}#{$suffix} { padding-top: $val; }
43
+ .gr-pr-#{$i}#{$suffix} { padding-right: $val; }
44
+ .gr-pb-#{$i}#{$suffix} { padding-bottom: $val; }
45
+ .gr-pl-#{$i}#{$suffix} { padding-left: $val; }
46
+
47
+ // Логические односторонние отступы: start — начало строки, end — конец.
48
+ // В LTR совпадают с left/right, в RTL меняются местами сами, без правил
49
+ // на [dir] и :dir().
50
+ //
51
+ // Адаптивных вариантов у них нет намеренно. Полный набор — 12 ступеней
52
+ // на четырёх свойствах и пяти брейкпоинтах, 240 селекторов и +1086 Б
53
+ // gzip; переход mx/px на одно свойство компенсирует из них 123 Б.
54
+ // Ступени сохранены все до одной — класс заменяется на логический
55
+ // один-в-один, — а платой за это стал отказ от суффикса брейкпоинта:
56
+ // так прирост держится в 240 Б gzip, а raw-размер файла даже падает.
57
+ @if $suffix == '' {
58
+ .gr-ms-#{$i} { margin-inline-start: $val; }
59
+ .gr-me-#{$i} { margin-inline-end: $val; }
60
+
61
+ .gr-ps-#{$i} { padding-inline-start: $val; }
62
+ .gr-pe-#{$i} { padding-inline-end: $val; }
63
+ }
64
+
65
+ // Осевые — одно логическое свойство вместо пары физических: в LTR
66
+ // результат тот же, в RTL корректный, а объявлений вдвое меньше.
67
+ .gr-mx-#{$i}#{$suffix} { margin-inline: $val; }
68
+
69
+ .gr-my-#{$i}#{$suffix} {
70
+ margin-top: $val;
71
+ margin-bottom: $val;
72
+ }
73
+
74
+ .gr-px-#{$i}#{$suffix} { padding-inline: $val; }
75
+
76
+ .gr-py-#{$i}#{$suffix} {
77
+ padding-top: $val;
78
+ padding-bottom: $val;
79
+ }
80
+ }
81
+
82
+ // Авто-отступы: центрирование и прижатие к краю
83
+ .gr-mx-auto#{$suffix} {
84
+ margin-inline: auto;
85
+ }
86
+
87
+ .gr-ml-auto#{$suffix} {
88
+ margin-left: auto;
89
+ }
90
+
91
+ .gr-mr-auto#{$suffix} {
92
+ margin-right: auto;
93
+ }
94
+
95
+ // Прижатие к краю строки, а не к стороне экрана: в RTL .gr-ms-auto
96
+ // отодвигает элемент вправо, .gr-me-auto — влево. Суффикса брейкпоинта
97
+ // нет по той же причине, что и у остальных логических классов.
98
+ @if $suffix == '' {
99
+ .gr-ms-auto {
100
+ margin-inline-start: auto;
101
+ }
102
+
103
+ .gr-me-auto {
104
+ margin-inline-end: auto;
105
+ }
106
+ }
107
+ }
108
+
109
+ @include gr-spacing-scale;
110
+
111
+ // Адаптивные варианты
112
+ @each $bp-name, $bp-value in bp.$gr-breakpoints {
113
+ @media (width >= $bp-value) {
114
+ @include gr-spacing-scale('-#{$bp-name}');
115
+ }
116
+ }
117
+
118
+ // Контейнерные варианты: тот же набор правил, но шириной меряется ближайший
119
+ // предок с .gr-cq, а не окно. Суффикс отличается одной буквой — .gr-p-4-cmd
120
+ // против .gr-p-4-md, — потому что синтаксис адаптивности в библиотеке один.
121
+ @each $bp-name, $bp-value in bp.$gr-breakpoints {
122
+ @include cq.gr-container-media($bp-name) {
123
+ @include gr-spacing-scale('-c#{$bp-name}');
124
+ }
125
+ }
@@ -0,0 +1,251 @@
1
+ // Griffincss — Typography Utilities
2
+ // Font sizes, weights, alignment, transform, line-height, decoration, font families
3
+
4
+ @use 'sass:math';
5
+ @use 'griffincss-core/scss/breakpoints' as bp;
6
+ @use 'griffincss-core/scss/container-mixins' as cq;
7
+
8
+ // Font size scale
9
+ $gr-text-sizes: (
10
+ xs: 0.75rem,
11
+ sm: 0.875rem,
12
+ base: 1rem,
13
+ lg: 1.125rem,
14
+ xl: 1.25rem,
15
+ 2xl: 1.5rem,
16
+ 3xl: 1.875rem,
17
+ 4xl: 2.25rem,
18
+ 5xl: 3rem,
19
+ 6xl: 3.75rem
20
+ );
21
+
22
+ @each $name, $size in $gr-text-sizes {
23
+ .gr-text-#{$name} { font-size: $size; }
24
+ }
25
+
26
+ // Относительные размеры: шаг в пикселях от текущего размера, а не от корня.
27
+ // Нужны там, где блок должен подстраиваться под окружение, не зная, в каком
28
+ // месте шаблона его покажут: виджет с одним и тем же содержимым в шапке
29
+ // и в подвале, подгружаемый из БД текст.
30
+ //
31
+ // Шаг задан в px, а не долей em, намеренно: при родителе 16px .gr-text-rel-sm
32
+ // даёт ровно 14px, как и базовый .gr-text-sm, — попадание в шкалу точное,
33
+ // без округлений. Обратная сторона в том, что шаг фиксирован: при родителе
34
+ // 32px тот же класс даст 30px, а не 28px.
35
+ //
36
+ // Ступени base здесь нет: класс, не меняющий размер, не нужен — его роль
37
+ // играет отсутствие класса.
38
+ //
39
+ // Адаптивных вариантов у набора нет намеренно — размер здесь задаёт
40
+ // вложенность, а не ширина окна или контейнера.
41
+ $gr-text-rel-steps: (
42
+ xs: -4px,
43
+ sm: -2px,
44
+ lg: 2px,
45
+ xl: 4px,
46
+ 2xl: 6px,
47
+ 3xl: 8px
48
+ );
49
+
50
+ @each $gr-name, $gr-delta in $gr-text-rel-steps {
51
+ .gr-text-rel-#{$gr-name} {
52
+ // Знак разворачивается в отдельную ветку: calc(1em + -4px) валиден,
53
+ // но читается в devtools хуже, чем calc(1em - 4px).
54
+ @if $gr-delta < 0 {
55
+ font-size: calc(1em - #{math.abs($gr-delta)});
56
+ } @else {
57
+ font-size: calc(1em + #{$gr-delta});
58
+ }
59
+ }
60
+ }
61
+
62
+ // Font weight
63
+ $gr-weights: (
64
+ "thin": 100,
65
+ "extralight": 200,
66
+ "light": 300,
67
+ "normal": 400,
68
+ "medium": 500,
69
+ "semibold": 600,
70
+ "bold": 700,
71
+ "extrabold": 800,
72
+ "black": 900
73
+ );
74
+
75
+ @each $name, $weight in $gr-weights {
76
+ .gr-font-#{$name} { font-weight: $weight; }
77
+ }
78
+
79
+ // Text alignment
80
+ // left/right буквальны и остаются такими: их выбирают, когда сторона
81
+ // действительно нужна физическая. Разворот по направлению письма даёт
82
+ // пара start/end — в LTR она совпадает с left/right, в RTL меняется местами.
83
+ .gr-text-left { text-align: left; }
84
+ .gr-text-center { text-align: center; }
85
+ .gr-text-right { text-align: right; }
86
+ .gr-text-justify { text-align: justify; }
87
+ .gr-text-start { text-align: start; }
88
+ .gr-text-end { text-align: end; }
89
+
90
+ // Text transform
91
+ .gr-uppercase { text-transform: uppercase; }
92
+ .gr-lowercase { text-transform: lowercase; }
93
+ .gr-capitalize { text-transform: capitalize; }
94
+
95
+ // Line height
96
+ $gr-leading: (
97
+ tight: 1.25,
98
+ snug: 1.375,
99
+ normal: 1.5,
100
+ relaxed: 1.625,
101
+ loose: 2
102
+ );
103
+
104
+ @each $name, $value in $gr-leading {
105
+ .gr-leading-#{$name} { line-height: $value; }
106
+ }
107
+
108
+ // Text decoration
109
+ .gr-underline { text-decoration: underline; }
110
+ .gr-no-underline { text-decoration: none; }
111
+ .gr-line-through { text-decoration: line-through; }
112
+
113
+ // Font style
114
+ .gr-italic { font-style: italic; }
115
+ .gr-not-italic { font-style: normal; }
116
+
117
+ // Whitespace and wrapping
118
+ .gr-break-words {
119
+ overflow-wrap: break-word;
120
+ }
121
+
122
+ .gr-truncate {
123
+ overflow: hidden;
124
+ text-overflow: ellipsis;
125
+ white-space: nowrap;
126
+ }
127
+
128
+ .gr-whitespace-nowrap { white-space: nowrap; }
129
+ .gr-whitespace-pre { white-space: pre; }
130
+ .gr-whitespace-normal { white-space: normal; }
131
+
132
+ // Обрезка по числу строк. -webkit-box здесь не пережиток: обрезка по строкам
133
+ // работает только внутри этой раскладки, стандартного эквивалента нет.
134
+ // Свойство line-clamp пишется рядом с префиксным — как только поддержка
135
+ // станет повсеместной, префиксную строку можно снять без правки классов.
136
+ @each $gr-lines in (1, 2, 3, 4, 5, 6) {
137
+ .gr-line-clamp-#{$gr-lines} {
138
+ display: -webkit-box;
139
+ overflow: hidden;
140
+ -webkit-line-clamp: $gr-lines;
141
+ line-clamp: $gr-lines;
142
+ -webkit-box-orient: vertical;
143
+ }
144
+ }
145
+
146
+ .gr-line-clamp-none {
147
+ display: block;
148
+ overflow: visible;
149
+ -webkit-line-clamp: none;
150
+ line-clamp: none;
151
+ }
152
+
153
+ // Маркеры списка. Ресет снимает их только с ul[role="list"] / ol[role="list"],
154
+ // эти классы дают тот же результат там, где менять разметку нельзя.
155
+ .gr-list-none {
156
+ // Свойство логическое, а не padding-left: маркерный отступ в RTL лежит
157
+ // справа, и физическая сторона снимала бы не тот отступ.
158
+ padding-inline-start: 0;
159
+ list-style: none;
160
+ }
161
+
162
+ .gr-list-disc { list-style: disc; }
163
+ .gr-list-decimal { list-style: decimal; }
164
+ .gr-list-inside { list-style-position: inside; }
165
+ .gr-list-outside { list-style-position: outside; }
166
+
167
+ // Перенос строк в заголовках и абзацах: balance выравнивает длину строк
168
+ // в коротком тексте, pretty убирает висячие слова в длинном.
169
+ .gr-text-balance { text-wrap: balance; }
170
+ .gr-text-pretty { text-wrap: pretty; }
171
+
172
+ // Font families
173
+ .gr-font-sans { font-family: var(--gr-font-sans); }
174
+ .gr-font-serif { font-family: var(--gr-font-serif); }
175
+ .gr-font-mono { font-family: var(--gr-font-mono); }
176
+
177
+ // Адаптивный набор — один на оба вида запроса. Оконный вариант получает
178
+ // суффикс брейкпоинта, контейнерный — тот же суффикс с буквой c; правила
179
+ // описаны один раз, поэтому разойтись не могут.
180
+ @mixin gr-typography-scale($suffix) {
181
+ // Font sizes responsive
182
+ @each $name, $size in $gr-text-sizes {
183
+ .gr-text-#{$name}#{$suffix} { font-size: $size; }
184
+ }
185
+
186
+ // Font weights responsive
187
+ @each $name, $weight in $gr-weights {
188
+ .gr-font-#{$name}#{$suffix} { font-weight: $weight; }
189
+ }
190
+
191
+ // Text alignment responsive
192
+ .gr-text-left#{$suffix} { text-align: left; }
193
+ .gr-text-center#{$suffix} { text-align: center; }
194
+ .gr-text-right#{$suffix} { text-align: right; }
195
+ .gr-text-justify#{$suffix} { text-align: justify; }
196
+ .gr-text-start#{$suffix} { text-align: start; }
197
+ .gr-text-end#{$suffix} { text-align: end; }
198
+
199
+ // Text transform responsive
200
+ .gr-uppercase#{$suffix} { text-transform: uppercase; }
201
+ .gr-lowercase#{$suffix} { text-transform: lowercase; }
202
+ .gr-capitalize#{$suffix} { text-transform: capitalize; }
203
+
204
+ // Line height responsive
205
+ @each $name, $value in $gr-leading {
206
+ .gr-leading-#{$name}#{$suffix} { line-height: $value; }
207
+ }
208
+
209
+ // Text decoration responsive
210
+ .gr-underline#{$suffix} { text-decoration: underline; }
211
+ .gr-no-underline#{$suffix} { text-decoration: none; }
212
+ .gr-line-through#{$suffix} { text-decoration: line-through; }
213
+
214
+ // Font style responsive
215
+ .gr-italic#{$suffix} { font-style: italic; }
216
+ .gr-not-italic#{$suffix} { font-style: normal; }
217
+
218
+ // Whitespace responsive
219
+ .gr-break-words#{$suffix} {
220
+ overflow-wrap: break-word;
221
+ }
222
+
223
+ .gr-truncate#{$suffix} {
224
+ overflow: hidden;
225
+ text-overflow: ellipsis;
226
+ white-space: nowrap;
227
+ }
228
+
229
+ .gr-whitespace-nowrap#{$suffix} { white-space: nowrap; }
230
+ .gr-whitespace-pre#{$suffix} { white-space: pre; }
231
+ .gr-whitespace-normal#{$suffix} { white-space: normal; }
232
+
233
+ // Font families responsive
234
+ .gr-font-sans#{$suffix} { font-family: var(--gr-font-sans); }
235
+ .gr-font-serif#{$suffix} { font-family: var(--gr-font-serif); }
236
+ .gr-font-mono#{$suffix} { font-family: var(--gr-font-mono); }
237
+ }
238
+
239
+ // Адаптивные варианты по ширине окна
240
+ @each $bp-name, $bp-value in bp.$gr-breakpoints {
241
+ @media (width >= $bp-value) {
242
+ @include gr-typography-scale('-#{$bp-name}');
243
+ }
244
+ }
245
+
246
+ // Контейнерные варианты — от ширины ближайшего предка с .gr-cq
247
+ @each $bp-name, $bp-value in bp.$gr-breakpoints {
248
+ @include cq.gr-container-media($bp-name) {
249
+ @include gr-typography-scale('-c#{$bp-name}');
250
+ }
251
+ }
@@ -0,0 +1,122 @@
1
+ // Griffincss — Visibility Utilities
2
+ // Display, visibility, and accessibility helpers
3
+
4
+ @use 'griffincss-core/scss/breakpoints' as bp;
5
+ @use 'griffincss-core/scss/container-mixins' as cq;
6
+
7
+ // Display. Флекс и грид сюда не входят: .gr-flex, .gr-inline-flex и .gr-grid
8
+ // живут в ядре, вместе с остальной раскладкой и своими адаптивными
9
+ // вариантами. Дубли .gr-flex-display / .gr-grid-display, разошедшиеся
10
+ // с ядром только из-за запрета пересечения классов, удалены в 0.8.0.
11
+ .gr-hidden { display: none; }
12
+ .gr-block { display: block; }
13
+ .gr-inline { display: inline; }
14
+ .gr-inline-block { display: inline-block; }
15
+
16
+ // Видимость без изъятия из потока: место под элемент сохраняется
17
+ .gr-invisible { visibility: hidden; }
18
+ .gr-visible { visibility: visible; }
19
+
20
+ // Overflow — по обеим осям и по каждой отдельно
21
+ @each $gr-value in (auto, hidden, clip, scroll, visible) {
22
+ .gr-overflow-#{$gr-value} { overflow: $gr-value; }
23
+ .gr-overflow-x-#{$gr-value} { overflow-x: $gr-value; }
24
+ .gr-overflow-y-#{$gr-value} { overflow-y: $gr-value; }
25
+ }
26
+
27
+ // Прокрутка внутри скруглённого блока. Полосу прокрутки Blink рисует
28
+ // прямоугольником и по border-radius НЕ обрезает: у блока с overflow: auto
29
+ // нижние (или боковые) углы срезаются полосой — скругление пропадает ровно
30
+ // там, где полоса появилась. Свойство overflow тут бессильно, а clip-path
31
+ // режет всю отрисовку элемента, полосу включительно.
32
+ //
33
+ // Радиус берётся из --gr-r — той самой переменной, которую публикуют
34
+ // .gr-radius* (Этап 9). Без неё утилита не делает ничего: фолбэк 0 оставляет
35
+ // прямые углы прямыми, вместо того чтобы скруглить блок, который скруглять
36
+ // не просили.
37
+ //
38
+ // <div class="gr-radius gr-overflow-x-auto gr-scroll-clip">…</div>
39
+ //
40
+ // Границы приёма. Углы обрезка возвращает, рамку — нет: полоса рисуется
41
+ // поверх нижней границы своего элемента, и свойствами самого блока эту
42
+ // границу не вернуть. Блоку с рамкой (а равно с внешней тенью, которую
43
+ // clip-path тоже срежет) нужен внешний узел: рамка и радиус снаружи,
44
+ // overflow внутри — тогда полосу обрежет обычный overflow: hidden.
45
+ // Прокручиваемой области с tabindex контур фокуса возвращают отрицательным
46
+ // outline-offset.
47
+ .gr-scroll-clip {
48
+ clip-path: inset(0 round var(--gr-r, 0));
49
+ }
50
+
51
+ // Только для скринридера. clip: rect() заменён на clip-path: inset(50%) —
52
+ // первое свойство объявлено устаревшим, второе даёт тот же результат.
53
+ // Правила собраны в миксин: focusable-вариант применяет их же, но лишь
54
+ // пока элемент не в фокусе.
55
+ @mixin gr-visually-hidden {
56
+ position: absolute;
57
+ width: 1px;
58
+ height: 1px;
59
+ padding: 0;
60
+ margin: -1px;
61
+ overflow: hidden;
62
+ clip-path: inset(50%);
63
+ white-space: nowrap;
64
+ border: 0;
65
+ }
66
+
67
+ .gr-sr-only {
68
+ @include gr-visually-hidden;
69
+ }
70
+
71
+ // Скрыт, пока его не выбрали с клавиатуры. Так делается ссылка «к содержимому»
72
+ // в начале страницы: мышью её не видно, по Tab она появляется.
73
+ .gr-sr-only-focusable:not(:focus, :focus-within) {
74
+ @include gr-visually-hidden;
75
+ }
76
+
77
+ // Обратная операция: вернуть в поток элемент, скрытый на узких экранах
78
+ .gr-not-sr-only {
79
+ position: static;
80
+ width: auto;
81
+ height: auto;
82
+ padding: 0;
83
+ margin: 0;
84
+ overflow: visible;
85
+ clip-path: none;
86
+ white-space: normal;
87
+ }
88
+
89
+ // Адаптивный набор — один на оба вида запроса. Оконный вариант получает
90
+ // суффикс брейкпоинта, контейнерный — тот же суффикс с буквой c; правила
91
+ // описаны один раз, поэтому разойтись не могут.
92
+ @mixin gr-visibility-scale($suffix) {
93
+ .gr-hidden#{$suffix} {
94
+ display: none;
95
+ }
96
+
97
+ .gr-block#{$suffix} {
98
+ display: block;
99
+ }
100
+
101
+ .gr-inline#{$suffix} {
102
+ display: inline;
103
+ }
104
+
105
+ .gr-inline-block#{$suffix} {
106
+ display: inline-block;
107
+ }
108
+ }
109
+
110
+ // Адаптивное скрытие по ширине окна
111
+ @each $bp-name, $bp-value in bp.$gr-breakpoints {
112
+ @media (width >= $bp-value) {
113
+ @include gr-visibility-scale('-#{$bp-name}');
114
+ }
115
+ }
116
+
117
+ // Контейнерное скрытие — от ширины ближайшего предка с .gr-cq
118
+ @each $bp-name, $bp-value in bp.$gr-breakpoints {
119
+ @include cq.gr-container-media($bp-name) {
120
+ @include gr-visibility-scale('-c#{$bp-name}');
121
+ }
122
+ }
@@ -0,0 +1,38 @@
1
+ // Griffincss Utils — версия, ограниченная областью .griffin
2
+ // Утилитарные классы действуют только внутри элементов с классом .griffin,
3
+ // что позволяет подключать библиотеку в чужую разметку без конфликтов.
4
+ // Токены (из griffincss-core) объявляются вне @scope: :root должен остаться глобальным.
5
+ //
6
+ // Слой тот же, что и у обычной сборки, — griffincss.utils.
7
+ //
8
+ // Требует поддержки CSS @scope (Chrome 118+, Safari 17.4+, Firefox 128+).
9
+
10
+ @use 'sass:meta';
11
+ @layer griffincss.reset, griffincss.core, griffincss.ui, griffincss.utils, griffincss.style;
12
+
13
+ // Весь вывод пакета — в слое griffincss.utils.
14
+ @layer griffincss.utils {
15
+ @include meta.load-css('griffincss-core/scss/tokens');
16
+
17
+ // Тема — тоже вне @scope: атрибут data-gr-theme стоит на <html>,
18
+ // то есть заведомо снаружи области .griffin.
19
+ @include meta.load-css('griffincss-core/scss/theme');
20
+
21
+ // @keyframes внутри @scope недействительны — подключаются вне области.
22
+ @include meta.load-css('keyframes');
23
+
24
+ @scope (.griffin) {
25
+ @include meta.load-css('animations');
26
+ @include meta.load-css('border-radius');
27
+ @include meta.load-css('borders');
28
+ @include meta.load-css('colors');
29
+ @include meta.load-css('effects');
30
+ @include meta.load-css('interactivity');
31
+ @include meta.load-css('position');
32
+ @include meta.load-css('shadows');
33
+ @include meta.load-css('sizing');
34
+ @include meta.load-css('spacing');
35
+ @include meta.load-css('typography');
36
+ @include meta.load-css('visibility');
37
+ }
38
+ }
@@ -0,0 +1,38 @@
1
+ // Griffincss Utils — утилитарные классы
2
+ // Отступы, типографика, цвета, размеры, границы, позиционирование,
3
+ // тени, эффекты, интерактивность и переходы.
4
+ //
5
+ // Надстройка над griffincss-core: токены и карта брейкпоинтов берутся оттуда
6
+ // (peer-зависимость), поэтому источник у них один на оба пакета. Собранный
7
+ // griffincss-utils.css при этом самодостаточен — :root входит в него целиком,
8
+ // подключать griffincss-core.css не требуется.
9
+ //
10
+ // Верхний слой библиотеки: утилиты выигрывают у ресета и сетки,
11
+ // но проигрывают пользовательскому CSS вне слоёв.
12
+
13
+ @use 'sass:meta';
14
+ @layer griffincss.reset, griffincss.core, griffincss.ui, griffincss.utils, griffincss.style;
15
+
16
+ // Весь вывод пакета — в слое griffincss.utils.
17
+ @layer griffincss.utils {
18
+ @include meta.load-css('griffincss-core/scss/tokens');
19
+
20
+ // Тема подключается и здесь, а не только в ядре: слой
21
+ // griffincss.utils старше griffincss.core, поэтому переопределения темы,
22
+ // приехавшие только с griffincss-core.css, проиграли бы базовому :root
23
+ // из этой сборки — независимо от специфичности селектора.
24
+ @include meta.load-css('griffincss-core/scss/theme');
25
+ @include meta.load-css('keyframes');
26
+ @include meta.load-css('animations');
27
+ @include meta.load-css('border-radius');
28
+ @include meta.load-css('borders');
29
+ @include meta.load-css('colors');
30
+ @include meta.load-css('effects');
31
+ @include meta.load-css('interactivity');
32
+ @include meta.load-css('position');
33
+ @include meta.load-css('shadows');
34
+ @include meta.load-css('sizing');
35
+ @include meta.load-css('spacing');
36
+ @include meta.load-css('typography');
37
+ @include meta.load-css('visibility');
38
+ }