sass4 4.0.2 → 4.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79095b6077df8eb4d50e07a93777f9329698826c6e1808c967e81b2287750d33
4
- data.tar.gz: 72dc31095bad03f738348e08827e23aa99a9bef422b3862d127e605ee3e45ddb
3
+ metadata.gz: b021450fcc4e657986b7fbddb76101e9c998d3bf0cc7d410bce53bfdd92fd470
4
+ data.tar.gz: 3bed1c189f812c0ed4bc13008a6136bfb247b0acf5be20a9c20bc29da5a9d8c2
5
5
  SHA512:
6
- metadata.gz: 995ef5b88bc45a6950ee82e53f3be623c0541904b660251cfacc675393f6827e95452a3c2036a01435a24adcc2b47aa37c0f5b89ad78dc741fd401e771ab1589
7
- data.tar.gz: f60e62faa1bb3e5bc9ceca43b31fcf16c8e767fca3b10e0d005da3550821301496aef0d16082a008fadaf8c946396bd71f2d9aad8576e18c7029ea368e6ea4e5
6
+ metadata.gz: b682b82f391271420c1af276c61748aa49f47ba6cc6e64fac6ef866367cff6fd5e33ec016852c316ec08289f547d287491c7d1fcddc0845ace1abded2dd24e62
7
+ data.tar.gz: f092c181f50eb32ac4e0dc3080bb532e53cb36201bfc4dfe5368e1320da14d8cb87234740748320207349393a8c6fae972591047cb0be669b4428284238ac6b7
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.0.2
1
+ 4.0.4
@@ -223,6 +223,7 @@ module Sass::Script::Value
223
223
  # Hash-equality must be transitive, so it just compares the exact value,
224
224
  # numerator units, and denominator units.
225
225
  def eql?(other)
226
+ return false unless other.is_a?(Number)
226
227
  basically_equal?(value, other.value) && numerator_units == other.numerator_units &&
227
228
  denominator_units == other.denominator_units
228
229
  end
@@ -904,12 +904,13 @@ module Sass
904
904
  # semantics.
905
905
  #
906
906
  # [token consumption algorithm]: https://drafts.csswg.org/css-syntax-3/#consume-token.
907
- result = tok(%r{
907
+ result = sass_variable_in_custom_property ||
908
+ tok(%r{
908
909
  (
909
910
  (?!
910
911
  url\(
911
912
  )
912
- [^()\[\]{}"'#/ \t\r\n\f#{top_level ? ";" : ""}]
913
+ [^()\[\]{}"'\#$/ \t\r\n\f#{top_level ? ";" : ""}]
913
914
  |
914
915
  \#(?!\{)
915
916
  |
@@ -1061,6 +1062,16 @@ module Sass
1061
1062
  sass_script(:parse_interpolated, warn_for_color)
1062
1063
  end
1063
1064
 
1065
+ def sass_variable_in_custom_property
1066
+ start_pos = source_position
1067
+ return unless tok(VARIABLE)
1068
+ name = @scanner[2]
1069
+ var = Sass::Script::Tree::Variable.new(name)
1070
+ var.line = @line
1071
+ var.source_range = range(start_pos)
1072
+ var
1073
+ end
1074
+
1064
1075
  def string
1065
1076
  return unless tok(STRING)
1066
1077
  Sass::Script::Value::String.value(@scanner[1] || @scanner[2])
data/lib/sass/scss/rx.rb CHANGED
@@ -126,8 +126,11 @@ module Sass
126
126
  STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|#{ESCAPE})*)\'/
127
127
  STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
128
128
 
129
- STATIC_COMPONENT = /#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}|\!important/i
130
- STATIC_VALUE = %r(#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*(?=[;}]))i
129
+ STATIC_COMPONENT = /#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}/i
130
+ # !important выделен отдельным необязательным суффиксом, чтобы избежать
131
+ # catastrophic backtracking когда !important идёт без пробела после значения
132
+ # (например: grid-template-areas: "a" "b" "c"!important)
133
+ STATIC_VALUE = %r(#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*\s*(\!#{W}important)?(?=[;}]))i
131
134
  STATIC_SELECTOR = /(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){1,50}([{])/i
132
135
  end
133
136
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass4
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natalie Weizenbaum
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2026-04-01 00:00:00.000000000 Z
14
+ date: 2026-04-03 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: sass-listen
@@ -103,12 +103,9 @@ files:
103
103
  - AGENTS.md
104
104
  - CODE_OF_CONDUCT.md
105
105
  - CONTRIBUTING.md
106
- - CSS_COLOR_LEVEL4_TESTS.md
107
106
  - MIT-LICENSE
108
107
  - README.md
109
- - REVISION
110
108
  - VERSION
111
- - VERSION_DATE
112
109
  - VERSION_NAME
113
110
  - bin/sass
114
111
  - bin/sass-convert
@@ -1,217 +0,0 @@
1
- # Тесты CSS Color Level 4 для Ruby Sass
2
-
3
- ## Обзор
4
-
5
- Полная поддержка синтаксиса CSS Color Level 4 согласно спецификации W3C: https://www.w3.org/TR/css-color-4/
6
-
7
- **Файл тестов:** `test/sass/css_color_level4_test.rb`
8
- **Всего тестов:** 40
9
- **Статус:** ✅ Все проходят
10
-
11
- ## Покрываемая функциональность
12
-
13
- ### 1. Special Numbers (CSS функции)
14
- Ruby Sass корректно обрабатывает CSS функции без попыток их вычисления:
15
- - `var()` - CSS Custom Properties
16
- - `calc()` - математические вычисления
17
- - `env()` - environment variables
18
- - `attr()` - атрибуты элементов
19
- - `clamp()` - ограничение значений
20
- - `min()` / `max()` - минимум/максимум
21
-
22
- **Примеры:**
23
- ```scss
24
- // var() в каналах
25
- rgb(var(--r), var(--g), var(--b))
26
- // ✅ rgb(var(--r), var(--g), var(--b))
27
-
28
- // calc() в альфе
29
- rgb(255 128 0 / calc(0.5 * 2))
30
- // ✅ rgb(255 128 0 / calc(0.5 * 2))
31
- ```
32
-
33
- ### 2. Space-separated синтаксис
34
- Новый синтаксис без запятых для RGB/HSL:
35
- ```scss
36
- rgb(255 128 0) // ✅ #ff8000
37
- hsl(180 50% 50%) // ✅ #40bfbf
38
- ```
39
-
40
- ### 3. Slash-separated альфа
41
- Альфа-канал через `/` вместо запятой:
42
- ```scss
43
- rgb(255 128 0 / 0.5) // ✅ rgba(255,128,0,0.5)
44
- hsl(180 50% 50% / 0.8) // ✅ rgba(64,191,191,0.8)
45
- ```
46
-
47
- ### 4. Проценты в RGB каналах
48
- RGB каналы могут быть указаны в процентах (0%-100%):
49
- ```scss
50
- rgb(100% 0% 0%) // ✅ red (#ff0000)
51
- rgb(50% 25% 75%) // ✅ #7f3fbf
52
- rgb(100% 50% 0%) // ✅ #ff7f00
53
- ```
54
-
55
- **Конвертация:**
56
- - `0%` → `0`
57
- - `100%` → `255`
58
- - `50%` → `127.5` → округление до `127`
59
-
60
- ### 5. Проценты в альфа-канале
61
- Альфа-канал поддерживает проценты (0%-100%):
62
- ```scss
63
- // Новый синтаксис
64
- rgb(100% 0% 0% / 50%) // ✅ rgba(255,0,0,0.5)
65
- rgb(255 128 0 / 50%) // ✅ rgba(255,128,0,0.5)
66
-
67
- // Legacy синтаксис
68
- rgba(255, 128, 0, 80%) // ✅ rgba(255,128,0,0.8)
69
-
70
- // HSL
71
- hsl(180 50% 50% / 75%) // ✅ rgba(64,191,191,0.75)
72
- ```
73
-
74
- **Конвертация:**
75
- - `0%` → `0` (полностью прозрачный)
76
- - `100%` → `1` (полностью непрозрачный)
77
- - `50%` → `0.5`
78
-
79
- ### 6. Комбинации процентов и CSS функций
80
- ```scss
81
- // Проценты в каналах + var() в альфе
82
- rgb(100% 0% 0% / var(--alpha))
83
- // ✅ rgb(100% 0% 0% / var(--alpha))
84
-
85
- // Проценты в каналах + calc() в альфе
86
- rgb(100% 50% 0% / calc(50% + 25%))
87
- // ✅ rgb(100% 50% 0% / calc(50% + 25%))
88
- ```
89
-
90
- ### 7. Обратная совместимость
91
- Все старые форматы продолжают работать:
92
- ```scss
93
- rgb(255, 128, 0) // ✅ #ff8000
94
- rgba(255, 128, 0, 0.5) // ✅ rgba(255,128,0,0.5)
95
- hsl(180, 50%, 50%) // ✅ #40bfbf
96
- hsla(180, 50%, 50%, 0.8) // ✅ rgba(64,191,191,0.8)
97
- ```
98
-
99
- ## Структура тестов
100
-
101
- ### RGB тесты (13 тестов)
102
- - `test_rgb_with_var` - var() в каналах
103
- - `test_rgb_with_calc` - calc() в каналах
104
- - `test_rgb_with_env` - env() в каналах
105
- - `test_rgb_with_clamp` - clamp() в каналах
106
- - `test_rgb_with_min_max` - min()/max() в каналах
107
- - `test_rgb_new_syntax_with_var_alpha` - var() в альфе (новый синтаксис)
108
- - `test_rgb_new_syntax_with_calc_alpha` - calc() в альфе (новый синтаксис)
109
- - `test_rgb_new_syntax_mixed_special_numbers` - смешанные CSS функции
110
- - `test_rgb_new_syntax_without_special_numbers` - новый синтаксис без CSS функций
111
- - `test_rgb_new_syntax_with_alpha_without_special_numbers` - новый синтаксис с альфой
112
- - `test_rgb_with_percentage_channels` - проценты в каналах
113
- - `test_rgb_with_percentage_channels_and_alpha` - проценты в каналах и альфе
114
- - `test_rgb_with_mixed_percentage_and_number` - числа в каналах, проценты в альфе
115
-
116
- ### RGBA тесты (6 тестов)
117
- - `test_rgba_with_var_all_channels` - var() во всех каналах
118
- - `test_rgba_with_calc_alpha` - calc() в альфе
119
- - `test_rgba_with_color_and_var_alpha` - Sass переменная + var() альфа
120
- - `test_rgba_new_syntax_with_special_alpha` - новый синтаксис с CSS функцией в альфе
121
- - `test_rgba_with_percentage_alpha` - процент в альфе (legacy синтаксис)
122
- - `test_rgba_legacy_syntax_percentage_alpha` - legacy синтаксис с процентной альфой
123
-
124
- ### HSL тесты (4 теста)
125
- - `test_hsl_with_var` - var() в hue
126
- - `test_hsl_with_calc` - calc() в hue
127
- - `test_hsl_new_syntax_with_var` - новый синтаксис с var()
128
- - `test_hsl_new_syntax_with_calc_alpha` - новый синтаксис с calc() в альфе
129
-
130
- ### HSLA тесты (3 теста)
131
- - `test_hsla_with_var_alpha` - var() в альфе
132
- - `test_hsla_with_env` - env() в hue
133
- - `test_hsla_new_syntax_with_special_alpha` - новый синтаксис с CSS функцией в альфе
134
-
135
- ### Процентные тесты (11 тестов)
136
- - `test_rgb_with_percentage_channels` - 100% каналы
137
- - `test_rgb_with_percentage_channels_and_alpha` - проценты + процентная альфа
138
- - `test_rgb_with_mixed_percentage_and_number` - смешанные числа и проценты
139
- - `test_rgb_with_percentage_channels_various_values` - различные значения процентов
140
- - `test_rgba_with_percentage_alpha` - процентная альфа в rgba()
141
- - `test_rgb_new_syntax_percentage_with_zero_alpha` - 0% альфа
142
- - `test_rgb_new_syntax_percentage_with_full_alpha` - 100% альфа
143
- - `test_hsl_with_percentage_alpha` - процентная альфа в hsl()
144
- - `test_rgb_percentage_with_var_in_alpha` - проценты + var() в альфе
145
- - `test_rgb_percentage_with_calc_in_alpha` - проценты + calc() в альфе
146
- - `test_rgba_legacy_syntax_percentage_alpha` - legacy синтаксис с процентной альфой
147
-
148
- ### Тесты обратной совместимости (4 теста)
149
- - `test_normal_rgb_still_works` - обычный rgb()
150
- - `test_normal_rgba_still_works` - обычный rgba()
151
- - `test_normal_hsl_still_works` - обычный hsl()
152
- - `test_normal_hsla_still_works` - обычный hsla()
153
-
154
- ### Смешанные тесты (2 теста)
155
- - `test_multiple_special_functions_in_one_rule` - несколько CSS функций в одном правиле
156
- - `test_sass_variables_with_special_numbers` - Sass переменные + CSS функции
157
-
158
- ## Запуск тестов
159
-
160
- ```bash
161
- # Запуск всех тестов CSS Color Level 4
162
- ruby test/sass/css_color_level4_test.rb
163
-
164
- # Ожидаемый результат:
165
- # Запуск тестов CSS Color Level 4...
166
- # ======================================================================
167
- # [40 тестов с ✅]
168
- # ======================================================================
169
- # Результаты: 40 прошли, 0 провалились из 40 тестов
170
- # ======================================================================
171
- ```
172
-
173
- ## Особенности реализации
174
-
175
- ### Округление процентов
176
- Ruby Sass использует стандартное округление для процентов:
177
- - `50%` → `127.5` → `127` (округление вниз)
178
- - `25%` → `63.75` → `63` (округление вниз)
179
- - `75%` → `191.25` → `191` (округление вниз)
180
-
181
- ### Обработка CSS функций
182
- CSS функции (`var()`, `calc()`, etc.) не вычисляются Sass и передаются в CSS как есть:
183
- ```scss
184
- rgb(var(--r), var(--g), var(--b))
185
- // Не вычисляется, передается как:
186
- rgb(var(--r), var(--g), var(--b))
187
- ```
188
-
189
- ### Оптимизация вывода
190
- Ruby Sass оптимизирует цвета где возможно:
191
- ```scss
192
- rgb(255, 0, 0) → red
193
- rgb(100% 0% 0%) → red
194
- rgb(255 0 0) → #ff0000
195
- rgb(255 0 0 / 100%) → #ff0000 // 100% alpha = полностью непрозрачный
196
- ```
197
-
198
- ## Ссылки
199
-
200
- - **Спецификация CSS Color Level 4:** https://www.w3.org/TR/css-color-4/
201
- - **Файл тестов:** `test/sass/css_color_level4_test.rb`
202
- - **Основная документация:** `AGENTS.md`
203
-
204
- ## История изменений
205
-
206
- ### Версия 4.0.1+ (текущая)
207
- - ✅ Добавлена поддержка процентов в RGB каналах
208
- - ✅ Добавлена поддержка процентов в альфа-канале
209
- - ✅ 11 новых тестов для процентов
210
- - ✅ Полное соответствие спецификации CSS Color Level 4 раздел 4.2
211
-
212
- ### Версия 4.0.0
213
- - ✅ Добавлена поддержка CSS special numbers (var, calc, env, etc.)
214
- - ✅ Добавлен новый space-separated синтаксис
215
- - ✅ Добавлен slash-separated синтаксис для альфы
216
- - ✅ 29 тестов для новых возможностей
217
-
data/REVISION DELETED
@@ -1 +0,0 @@
1
- 1ec7a3cb1fa5f0eb945c75747244bc3fd25417a2
data/VERSION_DATE DELETED
@@ -1 +0,0 @@
1
- 01 April 2026 12:46:06 UTC