@thejaredwilcurt/csslop 0.0.8 → 0.0.9

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.
Files changed (245) hide show
  1. package/README.md +11 -1
  2. package/package.json +11 -5
  3. package/site/assets/CSSLOP-KqihQ_En.js +2 -0
  4. package/site/assets/CSSLOP-KqihQ_En.js.map +1 -0
  5. package/site/assets/codemirror-BJgHO250.js +13 -0
  6. package/site/assets/codemirror-BJgHO250.js.map +1 -0
  7. package/site/assets/{codemirror-lang-css-CnXScSYC.js → codemirror-lang-css-BZgt8Gl_.js} +2 -2
  8. package/site/assets/{codemirror-lang-css-CnXScSYC.js.map → codemirror-lang-css-BZgt8Gl_.js.map} +1 -1
  9. package/site/assets/index-9t3YlATS.js +3 -0
  10. package/site/assets/index-9t3YlATS.js.map +1 -0
  11. package/site/assets/lib-B1rwTJiT.js +2 -0
  12. package/site/assets/lib-B1rwTJiT.js.map +1 -0
  13. package/site/real/30days30submits-18-v0.0.0.css +1 -0
  14. package/site/real/3dtransforms-v0.0.0.css +1 -0
  15. package/site/real/960.gs-v0.0.0.css +1 -0
  16. package/site/real/98-v0.1.18.css +1 -0
  17. package/site/real/academicons-v1.9.6.css +1 -0
  18. package/site/real/admin-lte-v4.0.0.css +1 -0
  19. package/site/real/adminhub-v1.0.0.css +594 -0
  20. package/site/real/amoled-cord-v5.0.11.css +1 -0
  21. package/site/real/animate-v4.1.1.css +1 -0
  22. package/site/real/animating-hamburger-icons-v0.1.0.css +1 -0
  23. package/site/real/animo-v1.0.3.css +1 -0
  24. package/site/real/animsition-v4.0.2.css +1 -0
  25. package/site/real/awesome-bootstrap-checkbox-v0.3.7.css +1 -0
  26. package/site/real/balloon-v1.0.0.css +1 -0
  27. package/site/real/basscss-v8.1.0.css +1 -0
  28. package/site/real/beercss-v4.0.21.css +1 -0
  29. package/site/real/blooger-website-v0.0.0.css +583 -0
  30. package/site/real/blue-topaz-obsidian-v6.0.0.css +1 -0
  31. package/site/real/boilerform-v1.1.2.css +1 -0
  32. package/site/real/bojler-v3.2.1.css +1 -0
  33. package/site/real/bootplus-v1.0.5.css +1 -0
  34. package/site/real/bootstrap-4-v4.6.2.css +1 -0
  35. package/site/real/bootstrap-5-v5.3.8.css +1 -0
  36. package/site/real/bttn-v0.2.4.css +1 -0
  37. package/site/real/bulma-v1.0.4.css +1 -0
  38. package/site/real/carbon-v1.107.0.css +1 -0
  39. package/site/real/cardinal-v3.7.0.css +1 -0
  40. package/site/real/checka11y-v2.5.0.css +1632 -0
  41. package/site/real/chota-v0.9.2.css +1 -0
  42. package/site/real/cirrus-v0.8.0.css +1 -0
  43. package/site/real/classless-v1.0.0.css +1 -0
  44. package/site/real/cleanslate-v0.10.1.css +1 -0
  45. package/site/real/clickeffects-v0.0.0.css +1548 -0
  46. package/site/real/codyframe-v4.0.9.css +1 -0
  47. package/site/real/colofilter-v0.0.0.css +1 -0
  48. package/site/real/concise-v4.0.1.css +1 -0
  49. package/site/real/crayon-v1.0.0.css +277 -0
  50. package/site/real/crookedstylesheets-v0.0.0.css +1 -0
  51. package/site/real/cs16-v0.0.0.css +1 -0
  52. package/site/real/css-diner-v0.0.0.css +1 -0
  53. package/site/real/css-extras-v0.4.0.css +1 -0
  54. package/site/real/css-social-buttons-v1.4.0.css +1 -0
  55. package/site/real/css-spinners-v2.2.0.css +1 -0
  56. package/site/real/css3-buttons-v0.0.0.css +1 -0
  57. package/site/real/cssco-v1.1.0.css +1 -0
  58. package/site/real/cssicon-v1.0.0.css +1 -0
  59. package/site/real/cssplot-v0.0.0.css +1 -0
  60. package/site/real/csszengarden-215-v0.0.0.css +1 -0
  61. package/site/real/cutestrap1-v1.3.1.css +1 -0
  62. package/site/real/cutestrap2-v2.0.0.css +1 -0
  63. package/site/real/destyle-v4.0.1.css +1 -0
  64. package/site/real/devices-v0.2.0.css +1 -0
  65. package/site/real/doxygen-awesome-v2.4.2.css +1 -0
  66. package/site/real/effeckt-v0.5.0.css +1 -0
  67. package/site/real/elegantfin-v25.12.31.css +1 -0
  68. package/site/real/enferno-v13.1.1.css +1 -0
  69. package/site/real/evil-v0.0.0.css +1 -0
  70. package/site/real/facebook-buttons-v1.0.0.css +1 -0
  71. package/site/real/ff-ultima-v4.3.0.css +1 -0
  72. package/site/real/fileicon-v0.1.1.css +1 -0
  73. package/site/real/finimalism-v12.0.0.css +6332 -0
  74. package/site/real/firefox-one-v3.7.0.css +174 -0
  75. package/site/real/firefox-uwp-style-v0.0.0.css +1608 -0
  76. package/site/real/flakes-v1.0.1.css +1 -0
  77. package/site/real/flex-layout-attribute-v1.0.3.css +1 -0
  78. package/site/real/fluentbird-v1.1.2.css +1 -0
  79. package/site/real/fomantic-v2.9.4.css +1 -0
  80. package/site/real/font-awesome-v7.2.0.css +1 -0
  81. package/site/real/foundation-v6.9.0.css +1 -0
  82. package/site/real/freebies-v0.0.0.css +1 -0
  83. package/site/real/furatto-v3.1.1.css +1 -0
  84. package/site/real/gallery-v1.0.2.css +1 -0
  85. package/site/real/github-dark-v6.3.0.css +1 -0
  86. package/site/real/github-markdown-v5.9.0.css +1 -0
  87. package/site/real/github-windows-v0.6.0.css +1 -0
  88. package/site/real/gitweb-theme-v0.0.0.css +1 -0
  89. package/site/real/google-type-v0.0.0.css +1 -0
  90. package/site/real/gridism-v0.2.2.css +1 -0
  91. package/site/real/gridlex-v2.7.1.css +1 -0
  92. package/site/real/gumby-v2.6.4.css +1 -0
  93. package/site/real/gutenberg-v0.7.0.css +1 -0
  94. package/site/real/halfmoon-v2.0.2.css +1 -0
  95. package/site/real/halfstyle-v2.0.2.css +1 -0
  96. package/site/real/hint-v3.0.0.css +1 -0
  97. package/site/real/holmes-v6.8.12.css +1 -0
  98. package/site/real/hover-buttons-v0.15.0.css +2960 -0
  99. package/site/real/html-sheets-of-paper-v0.0.0.css +1 -0
  100. package/site/real/hugo-universal-theme-v1.4.1.css +1 -0
  101. package/site/real/icon-hover-effects-v0.0.0.css +1 -0
  102. package/site/real/instagram-v0.1.4.css +1 -0
  103. package/site/real/jupyter-themes-v0.20.0.css +1 -0
  104. package/site/real/justified-v0.0.0.css +1 -0
  105. package/site/real/kickoff-v8.0.0.css +1 -0
  106. package/site/real/knacss-v8.2.0.css +1 -0
  107. package/site/real/less-framework-v0.0.0.css +1 -0
  108. package/site/real/linktree-v0.0.0.css +1 -0
  109. package/site/real/littlebox-v0.0.4.css +1 -0
  110. package/site/real/load-awesome-v1.1.0.css +1 -0
  111. package/site/real/loaders-v0.1.2.css +1 -0
  112. package/site/real/luxbar-v0.3.0.css +1 -0
  113. package/site/real/lynx-v1.4.0.css +1 -0
  114. package/site/real/markdown-css-v0.0.0.css +1 -0
  115. package/site/real/material-for-bootstrap-v4.1.1.css +1 -0
  116. package/site/real/medium.css-v1.0.2.css +1 -0
  117. package/site/real/meyer-v2.0.0.css +1 -0
  118. package/site/real/microsoft-metro-buttons-v1.2.0.css +1 -0
  119. package/site/real/microtip-v0.2.2.css +1 -0
  120. package/site/real/mini-v3.0.1.css +1 -0
  121. package/site/real/minireset-v0.0.7.css +1 -0
  122. package/site/real/missing-v1.3.0.css +1 -0
  123. package/site/real/mobi-v3.1.1.css +1 -0
  124. package/site/real/mocka-v1.0.1.css +1 -0
  125. package/site/real/modern-css-resets-v1.4.0.css +1 -0
  126. package/site/real/mvcss-v4.1.0.css +1347 -0
  127. package/site/real/mvp-v1.17.3.css +1 -0
  128. package/site/real/my-internet-v1.0.0.css +692 -0
  129. package/site/real/natural-selection-v0.0.0.css +1 -0
  130. package/site/real/nes-v2.3.0.css +1 -0
  131. package/site/real/normalize-v8.0.1.css +1 -0
  132. package/site/real/object-fit-polyfill-v0.3.4.css +1 -0
  133. package/site/real/obnoxious-v3.5.2.css +1 -0
  134. package/site/real/obsidian-colored-sidebar-v2.0.0.css +1 -0
  135. package/site/real/obsidian-modular-css-layout-v0.10.0.css +1 -0
  136. package/site/real/obsidian-notebook-themes-v2.2.3.css +1 -0
  137. package/site/real/off-canvas-menu-effects-v0.0.0.css +1 -0
  138. package/site/real/orbit-v1.4.11.css +1 -0
  139. package/site/real/orgcss-v9.2.3.css +2464 -0
  140. package/site/real/paper-v0.4.1.css +1 -0
  141. package/site/real/patternbolt-v0.0.0.css +1 -0
  142. package/site/real/patternfly-v6.5.2.css +1 -0
  143. package/site/real/pesticide-v1.3.0.css +1 -0
  144. package/site/real/phonon-v1.5.1.css +6232 -0
  145. package/site/real/photon-v0.1.2.css +1 -0
  146. package/site/real/picnic-v7.1.0.css +1 -0
  147. package/site/real/pico-v2.1.1.css +1 -0
  148. package/site/real/pills-v1.0.1.css +1 -0
  149. package/site/real/portfolio-template-v0.0.0.css +1 -0
  150. package/site/real/preboot-v2.0.0.css +1 -0
  151. package/site/real/pretty-checkbox-v3.0.3.css +1 -0
  152. package/site/real/progress-tracker-v3.0.0.css +1 -0
  153. package/site/real/protonmail-themes-v4.0.8.css +276 -0
  154. package/site/real/proxmorph-v2.7.3.css +1 -0
  155. package/site/real/pure-v3.0.0.css +1 -0
  156. package/site/real/pygments-fruity-v1.0.0.css +1 -0
  157. package/site/real/ratchet-v2.0.2.css +1 -0
  158. package/site/real/remedy-quotes-v0.1.0.css +1 -0
  159. package/site/real/remedy-v0.1.0.css +1 -0
  160. package/site/real/repaintless-v1.4.0.css +1 -0
  161. package/site/real/reset-v1.0.2.css +1 -0
  162. package/site/real/responsive-4-v4.1.4.css +1 -0
  163. package/site/real/responsive-5-v5.0.0.css +1 -0
  164. package/site/real/ress-v5.0.2.css +1 -0
  165. package/site/real/rippleui-v1.12.1.css +1 -0
  166. package/site/real/sakura-v1.5.1.css +1 -0
  167. package/site/real/sanitize-v13.0.0.css +1 -0
  168. package/site/real/sapc-apca-v0.0.0.css +1 -0
  169. package/site/real/select-v3.2.0.css +1 -0
  170. package/site/real/select2-bootstrap-v1.2.5.css +1 -0
  171. package/site/real/semantic-v2.5.0.css +1 -0
  172. package/site/real/shards-v3.0.0.css +1 -0
  173. package/site/real/shina-fox-v0.1.0.css +1 -0
  174. package/site/real/sierra-v3.5.0.css +1 -0
  175. package/site/real/simple-grid-v0.0.0.css +1 -0
  176. package/site/real/simple-line-icons-v2.5.4.css +1 -0
  177. package/site/real/simple-v2.3.7.css +1 -0
  178. package/site/real/simptip-v1.0.4.css +1 -0
  179. package/site/real/skeleton-v2.0.4.css +1 -0
  180. package/site/real/slitslider-v1.1.0.css +115 -0
  181. package/site/real/social-signin-buttons-v0.0.0.css +1 -0
  182. package/site/real/spcss-v0.9.0.css +1 -0
  183. package/site/real/spectre-v0.5.9.css +1 -0
  184. package/site/real/spicetify-bloom-v0.0.0.css +1 -0
  185. package/site/real/spicetify-dribbblish-v0.0.0.css +1 -0
  186. package/site/real/spicetify-text-v0.0.0.css +1 -0
  187. package/site/real/spinkit-v2.0.1.css +1 -0
  188. package/site/real/stackicons-v1.13.0.css +1 -0
  189. package/site/real/stackoverflow-dark-v5.1.2.css +1 -0
  190. package/site/real/stacks-v2.8.6.css +1 -0
  191. package/site/real/swagger-ui-themes-2-v2.1.0.css +1 -0
  192. package/site/real/swagger-ui-themes-3-v3.0.1.css +1 -0
  193. package/site/real/system-v0.1.11.css +1 -0
  194. package/site/real/tablecloth-v1.0.0.css +1 -0
  195. package/site/real/tachyons-v4.12.0.css +1 -0
  196. package/site/real/tailwind-cards-v0.0.0.css +1 -0
  197. package/site/real/tailwind-v2.2.19.css +1 -0
  198. package/site/real/the-50-front-end-project-44-v0.0.0.css +1 -0
  199. package/site/real/the-new-css-reset-v1.11.3.css +1 -0
  200. package/site/real/toast-v1.1.0.css +1 -0
  201. package/site/real/tocas-v5.7.0.css +1 -0
  202. package/site/real/tooltip-twispy-v1.0.6.css +1 -0
  203. package/site/real/tootik-v1.0.2.css +428 -0
  204. package/site/real/tuesday-v1.3.0.css +1115 -0
  205. package/site/real/tufte-v1.8.0.css +1 -0
  206. package/site/real/tui-v2.1.2.css +1 -0
  207. package/site/real/tw-animate-css-v1.4.0.css +1 -0
  208. package/site/real/uikit-v3.25.17.css +1 -0
  209. package/site/real/unfold-v0.0.0.css +3569 -0
  210. package/site/real/universal-v0.0.0.css +1 -0
  211. package/site/real/uswds-v3.13.0.css +1 -0
  212. package/site/real/utility-opentype-v0.1.4.css +1 -0
  213. package/site/real/vim-css3-syntax-v2.10.0.css +1 -0
  214. package/site/real/virtual-bookshelf-v1.1.0.css +211 -0
  215. package/site/real/vitepress-v1.6.4.css +1 -0
  216. package/site/real/vivify-v1.0.0.css +1 -0
  217. package/site/real/voxels-v1.0.0.css +1 -0
  218. package/site/real/w3css-v4.10.0.css +233 -0
  219. package/site/real/waffle-grid-v1.3.6.css +1 -0
  220. package/site/real/water-v2.1.1.css +1 -0
  221. package/site/real/weather-icons-v2.0.10.css +1 -0
  222. package/site/real/webgradients-v0.0.0.css +1 -0
  223. package/site/real/wenk-v1.0.8.css +1 -0
  224. package/site/real/wikipedia-dark-v3.7.9.css +1 -0
  225. package/site/real/windows-95-v0.0.0.css +1 -0
  226. package/site/real/windows-98-v0.0.1.css +1 -0
  227. package/site/real/wing-v1.0.0.css +1 -0
  228. package/site/real/woah-v1.3.1.css +1 -0
  229. package/site/real/wtf-forms-v2.2.0.css +1 -0
  230. package/site/real/yacy-v4.1.2.css +1 -0
  231. package/site/real/yue-v1.1.1.css +1 -0
  232. package/site/real/zotero-dark-theme-v0.0.0.css +1 -0
  233. package/site/real.json +100 -0
  234. package/src/declarations/process.js +5 -0
  235. package/src/index.js +135 -1
  236. package/src/rules/optimize.js +22 -1
  237. package/src/rules/stringify.js +67 -1
  238. package/src/value/minify.js +116 -25
  239. package/src/value/quotes.js +62 -0
  240. package/site/assets/CSSLOP-DIcsfyiN.js +0 -2
  241. package/site/assets/CSSLOP-DIcsfyiN.js.map +0 -1
  242. package/site/assets/codemirror-CRWP0c-o.js +0 -13
  243. package/site/assets/codemirror-CRWP0c-o.js.map +0 -1
  244. package/site/assets/index-BtSQKlYm.js +0 -4
  245. package/site/assets/index-BtSQKlYm.js.map +0 -1
package/site/real.json CHANGED
@@ -29,6 +29,11 @@
29
29
  "name": "AdminLTE",
30
30
  "size": 410009
31
31
  },
32
+ {
33
+ "fileName": "adminhub-v1.0.0.css",
34
+ "name": "AdminHub",
35
+ "size": 10992
36
+ },
32
37
  {
33
38
  "fileName": "amoled-cord-v5.0.11.css",
34
39
  "name": "AMOLED-cord",
@@ -74,6 +79,11 @@
74
79
  "name": "Beer CSS",
75
80
  "size": 107117
76
81
  },
82
+ {
83
+ "fileName": "blooger-website-v0.0.0.css",
84
+ "name": "Blooger_Website",
85
+ "size": 10667
86
+ },
77
87
  {
78
88
  "fileName": "blue-topaz-obsidian-v6.0.0.css",
79
89
  "name": "Blue-Topaz Obsidian",
@@ -124,6 +134,11 @@
124
134
  "name": "Cardinal",
125
135
  "size": 160885
126
136
  },
137
+ {
138
+ "fileName": "checka11y-v2.5.0.css",
139
+ "name": "Checka11y",
140
+ "size": 84136
141
+ },
127
142
  {
128
143
  "fileName": "chota-v0.9.2.css",
129
144
  "name": "Chota",
@@ -144,6 +159,11 @@
144
159
  "name": "CleanSlate",
145
160
  "size": 20543
146
161
  },
162
+ {
163
+ "fileName": "clickeffects-v0.0.0.css",
164
+ "name": "ClickEffects",
165
+ "size": 33700
166
+ },
147
167
  {
148
168
  "fileName": "codyframe-v4.0.9.css",
149
169
  "name": "CodeFrame",
@@ -159,6 +179,11 @@
159
179
  "name": "Concise",
160
180
  "size": 17115
161
181
  },
182
+ {
183
+ "fileName": "crayon-v1.0.0.css",
184
+ "name": "Crayon",
185
+ "size": 6861
186
+ },
162
187
  {
163
188
  "fileName": "crookedstylesheets-v0.0.0.css",
164
189
  "name": "CrookedStyleSheets",
@@ -274,6 +299,21 @@
274
299
  "name": "Fileicon",
275
300
  "size": 2765
276
301
  },
302
+ {
303
+ "fileName": "finimalism-v12.0.0.css",
304
+ "name": "Finimalism",
305
+ "size": 189023
306
+ },
307
+ {
308
+ "fileName": "firefox-one-v3.7.0.css",
309
+ "name": "Firefox-ONE",
310
+ "size": 7849
311
+ },
312
+ {
313
+ "fileName": "firefox-uwp-style-v0.0.0.css",
314
+ "name": "Firefox-UWP-Style",
315
+ "size": 48593
316
+ },
277
317
  {
278
318
  "fileName": "flakes-v1.0.1.css",
279
319
  "name": "Flakes",
@@ -384,6 +424,11 @@
384
424
  "name": "Holmes",
385
425
  "size": 12527
386
426
  },
427
+ {
428
+ "fileName": "hover-buttons-v0.15.0.css",
429
+ "name": "Hover Buttons",
430
+ "size": 53032
431
+ },
387
432
  {
388
433
  "fileName": "html-sheets-of-paper-v0.0.0.css",
389
434
  "name": "HTML Sheets of Paper",
@@ -519,11 +564,21 @@
519
564
  "name": "Modern CSS Resets",
520
565
  "size": 1307
521
566
  },
567
+ {
568
+ "fileName": "mvcss-v4.1.0.css",
569
+ "name": "MVCSS",
570
+ "size": 24333
571
+ },
522
572
  {
523
573
  "fileName": "mvp-v1.17.3.css",
524
574
  "name": "MVP",
525
575
  "size": 10327
526
576
  },
577
+ {
578
+ "fileName": "my-internet-v1.0.0.css",
579
+ "name": "My Internet",
580
+ "size": 17831
581
+ },
527
582
  {
528
583
  "fileName": "natural-selection-v0.0.0.css",
529
584
  "name": "Natural Selection",
@@ -574,6 +629,11 @@
574
629
  "name": "Orbit",
575
630
  "size": 156028
576
631
  },
632
+ {
633
+ "fileName": "orgcss-v9.2.3.css",
634
+ "name": "OrgCSS",
635
+ "size": 50112
636
+ },
577
637
  {
578
638
  "fileName": "paper-v0.4.1.css",
579
639
  "name": "Paper",
@@ -594,6 +654,11 @@
594
654
  "name": "Pesticide",
595
655
  "size": 20149
596
656
  },
657
+ {
658
+ "fileName": "phonon-v1.5.1.css",
659
+ "name": "Phonon",
660
+ "size": 159930
661
+ },
597
662
  {
598
663
  "fileName": "photon-v0.1.2.css",
599
664
  "name": "Photon",
@@ -634,6 +699,11 @@
634
699
  "name": "Progress Tracker",
635
700
  "size": 9391
636
701
  },
702
+ {
703
+ "fileName": "protonmail-themes-v4.0.8.css",
704
+ "name": "ProtonMail Themes",
705
+ "size": 8606
706
+ },
637
707
  {
638
708
  "fileName": "proxmorph-v2.7.3.css",
639
709
  "name": "ProxMorph",
@@ -764,6 +834,11 @@
764
834
  "name": "Skeleton",
765
835
  "size": 11519
766
836
  },
837
+ {
838
+ "fileName": "slitslider-v1.1.0.css",
839
+ "name": "SlitSlider",
840
+ "size": 2240
841
+ },
767
842
  {
768
843
  "fileName": "social-signin-buttons-v0.0.0.css",
769
844
  "name": "Social Sign-in Buttons",
@@ -874,6 +949,16 @@
874
949
  "name": "Tooltip Twispy",
875
950
  "size": 6378
876
951
  },
952
+ {
953
+ "fileName": "tootik-v1.0.2.css",
954
+ "name": "Tootik",
955
+ "size": 44368
956
+ },
957
+ {
958
+ "fileName": "tuesday-v1.3.0.css",
959
+ "name": "Tuesday",
960
+ "size": 27216
961
+ },
877
962
  {
878
963
  "fileName": "tufte-v1.8.0.css",
879
964
  "name": "Tufte",
@@ -894,6 +979,11 @@
894
979
  "name": "UIkit",
895
980
  "size": 400799
896
981
  },
982
+ {
983
+ "fileName": "unfold-v0.0.0.css",
984
+ "name": "Unfold",
985
+ "size": 90068
986
+ },
897
987
  {
898
988
  "fileName": "universal-v0.0.0.css",
899
989
  "name": "Universal.css",
@@ -914,6 +1004,11 @@
914
1004
  "name": "Vim CSS3 Syntax",
915
1005
  "size": 32291
916
1006
  },
1007
+ {
1008
+ "fileName": "virtual-bookshelf-v1.1.0.css",
1009
+ "name": "Virtual Bookshelf",
1010
+ "size": 5068
1011
+ },
917
1012
  {
918
1013
  "fileName": "vitepress-v1.6.4.css",
919
1014
  "name": "VitePress",
@@ -929,6 +1024,11 @@
929
1024
  "name": "Voxels",
930
1025
  "size": 4808
931
1026
  },
1027
+ {
1028
+ "fileName": "w3css-v4.10.0.css",
1029
+ "name": "w3css",
1030
+ "size": 23124
1031
+ },
932
1032
  {
933
1033
  "fileName": "waffle-grid-v1.3.6.css",
934
1034
  "name": "Waffle Grid",
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  import { minifyValue } from '../value/minify.js';
6
+ import { hasInvalidQuotesCount } from '../value/quotes.js';
6
7
  import { collapseShorthandParts } from '../value/shared.js';
7
8
 
8
9
  import {
@@ -498,6 +499,10 @@ function processDeclarations (declarations, context) {
498
499
  continue;
499
500
  }
500
501
 
502
+ if (propertyName === 'quotes' && hasInvalidQuotesCount(declaration.value)) {
503
+ continue;
504
+ }
505
+
501
506
  let minifiedValue = minifyValue(declaration);
502
507
 
503
508
  let previousIndex = -1;
package/src/index.js CHANGED
@@ -31,6 +31,138 @@ import {
31
31
  import { stringifyRule } from './rules/stringify.js';
32
32
  import { minifyValue } from './value/minify.js';
33
33
 
34
+ /**
35
+ * Splits a minified CSS selector list at top-level commas, respecting
36
+ * parenthesized and bracketed groups so that commas inside pseudo-class
37
+ * arguments like `:is(a, b)` are not treated as selector separators.
38
+ *
39
+ * @param {string} selectorList The comma-separated selector list string.
40
+ * @return {Array} An array of individual selector strings.
41
+ */
42
+ function splitSelectorList (selectorList) {
43
+ const selectors = [];
44
+ let current = '';
45
+ let depth = 0;
46
+ for (const character of selectorList) {
47
+ if (character === '(' || character === '[') {
48
+ depth++;
49
+ current += character;
50
+ } else if (character === ')' || character === ']') {
51
+ depth--;
52
+ current += character;
53
+ } else if (character === ',' && depth === 0) {
54
+ selectors.push(current.trim());
55
+ current = '';
56
+ } else {
57
+ current += character;
58
+ }
59
+ }
60
+ const remaining = current.trim();
61
+ if (remaining) {
62
+ selectors.push(remaining);
63
+ }
64
+ return selectors;
65
+ }
66
+
67
+ /**
68
+ * Deduplicates a minified CSS selector list string by splitting at top-level
69
+ * commas, removing duplicate selectors, and rejoining with commas.
70
+ *
71
+ * @param {string} selectorList The comma-separated selector list string.
72
+ * @return {string} The deduplicated selector list string.
73
+ */
74
+ function deduplicateSelectorList (selectorList) {
75
+ const selectors = splitSelectorList(selectorList);
76
+ const seen = new Set();
77
+ const unique = selectors.filter((selector) => {
78
+ if (seen.has(selector)) {
79
+ return false;
80
+ }
81
+ seen.add(selector);
82
+ return true;
83
+ });
84
+ return unique.join(',');
85
+ }
86
+
87
+ /**
88
+ * Extracts the declaration body (from the opening brace to the end) of a
89
+ * stringified CSS rule. Returns null for at-rules or strings without braces,
90
+ * since those should not participate in selector merging.
91
+ *
92
+ * @param {string} ruleString A stringified CSS rule.
93
+ * @return {string|null} The body substring starting at `{`, or null if not a simple rule.
94
+ */
95
+ function extractRuleBody (ruleString) {
96
+ // At-rules start with @ and should not be merged by selector
97
+ if (ruleString.startsWith('@')) {
98
+ return null;
99
+ }
100
+ const braceIndex = ruleString.indexOf('{');
101
+ if (braceIndex === -1) {
102
+ return null;
103
+ }
104
+ return ruleString.slice(braceIndex);
105
+ }
106
+
107
+ /**
108
+ * Normalizes a stringified CSS rule body for order-independent comparison
109
+ * by sorting top-level declarations alphabetically. Bodies that contain
110
+ * nested rules (additional `{` characters beyond the opening brace) are
111
+ * returned as-is since their internal structure makes simple sorting unsafe.
112
+ *
113
+ * @param {string} body The rule body string starting with `{`.
114
+ * @return {string} The body with declarations sorted, or the original body if it contains nested rules.
115
+ */
116
+ function normalizeBodyForComparison (body) {
117
+ // Nested rules contain additional opening braces; skip normalization
118
+ if (body.indexOf('{', 1) !== -1) {
119
+ return body;
120
+ }
121
+ const inner = body.slice(1, -1);
122
+ if (!inner) {
123
+ return body;
124
+ }
125
+ const declarations = inner.split(';').filter(Boolean).sort();
126
+ return '{' + declarations.join(';') + '}';
127
+ }
128
+
129
+ /**
130
+ * Merges consecutive stringified rules that share an identical declaration
131
+ * body into a single rule with comma-separated selectors. This catches
132
+ * rules whose values only become identical after minification (e.g.
133
+ * `#F00` and `rgb(255,0,0)` both minify to `red`).
134
+ *
135
+ * @param {Array} ruleStrings The array of stringified CSS rule strings.
136
+ * @return {Array} A new array with adjacent identical-body rules merged.
137
+ */
138
+ function mergeAdjacentRulesWithIdenticalBodies (ruleStrings) {
139
+ const result = [];
140
+ for (const ruleString of ruleStrings) {
141
+ if (!ruleString) {
142
+ continue;
143
+ }
144
+ const lastResult = result[result.length - 1];
145
+ if (lastResult) {
146
+ const lastBody = extractRuleBody(lastResult);
147
+ const currentBody = extractRuleBody(ruleString);
148
+ const bodiesAreEquivalent = (
149
+ lastBody &&
150
+ currentBody &&
151
+ normalizeBodyForComparison(lastBody) === normalizeBodyForComparison(currentBody)
152
+ );
153
+ if (bodiesAreEquivalent) {
154
+ const lastSelector = lastResult.slice(0, lastResult.length - lastBody.length);
155
+ const currentSelector = ruleString.slice(0, ruleString.length - currentBody.length);
156
+ const combinedSelector = deduplicateSelectorList(lastSelector + ',' + currentSelector);
157
+ result[result.length - 1] = combinedSelector + lastBody;
158
+ continue;
159
+ }
160
+ }
161
+ result.push(ruleString);
162
+ }
163
+ return result;
164
+ }
165
+
34
166
  /**
35
167
  * Parses, optimizes, and minifies a CSS string by applying rule merging, declaration deduplication, value compression, and dead-code elimination.
36
168
  *
@@ -95,7 +227,9 @@ export const minifyCSS = function (input) {
95
227
  output.push(stringifyRule(rule, context));
96
228
  }
97
229
 
98
- return restoreEscapeSequences(output.join(''));
230
+ const mergedOutput = mergeAdjacentRulesWithIdenticalBodies(output);
231
+
232
+ return restoreEscapeSequences(mergedOutput.join(''));
99
233
  }
100
234
 
101
235
  return source;
@@ -366,6 +366,26 @@ function deduplicateKeyframes (rules) {
366
366
  });
367
367
  }
368
368
 
369
+ /**
370
+ * Removes duplicate selectors from a combined selector list by normalizing
371
+ * whitespace and preserving the first occurrence of each unique selector.
372
+ *
373
+ * @param {Array} selectors The selector strings to deduplicate.
374
+ * @return {Array} A new array with duplicate selectors removed.
375
+ */
376
+ function deduplicateSelectors (selectors) {
377
+ const seen = new Set();
378
+ return selectors.filter((selector) => {
379
+ // Normalize whitespace to single spaces for consistent comparison
380
+ const normalized = selector.trim().replace(/\s+/g, ' ');
381
+ if (seen.has(normalized)) {
382
+ return false;
383
+ }
384
+ seen.add(normalized);
385
+ return true;
386
+ });
387
+ }
388
+
369
389
  /**
370
390
  * Merges consecutive rules whose declarations are a subset of the following rule, combining their selectors and splitting out any extra declarations.
371
391
  *
@@ -409,7 +429,8 @@ function mergeByDeclarations (rules) {
409
429
  return !commonProperties.has(declaration.property);
410
430
  });
411
431
  result.pop();
412
- result.push({ ...previousRule, selectors: [...previousRule.selectors, ...rule.selectors] });
432
+ const combinedSelectors = deduplicateSelectors([...previousRule.selectors, ...rule.selectors]);
433
+ result.push({ ...previousRule, selectors: combinedSelectors });
413
434
  if (currentOnlyDeclarations.length > 0) {
414
435
  result.push({ ...rule, declarations: currentOnlyDeclarations });
415
436
  }
@@ -361,6 +361,68 @@ function processIsSelector (selector) {
361
361
  return [':is(' + parts.join(',') + ')'];
362
362
  }
363
363
 
364
+ /**
365
+ * Removes spaces after commas only inside parenthesized groups (function
366
+ * calls like `var()`, `calc()`), leaving top-level comma spacing intact.
367
+ *
368
+ * @param {string} value The whitespace-collapsed custom property value.
369
+ * @return {string} The value with post-comma spaces removed inside function calls only.
370
+ */
371
+ function removeSpacesAfterCommasInsideFunctions (value) {
372
+ let result = '';
373
+ let parenthesisDepth = 0;
374
+ for (let index = 0; index < value.length; index++) {
375
+ const character = value[index];
376
+ if (character === '(') {
377
+ parenthesisDepth++;
378
+ }
379
+ if (character === ')') {
380
+ parenthesisDepth--;
381
+ }
382
+ if (character === ',' && parenthesisDepth > 0) {
383
+ result += ',';
384
+ // Skip whitespace after the comma inside function calls
385
+ while (index + 1 < value.length && value[index + 1] === ' ') {
386
+ index++;
387
+ }
388
+ } else {
389
+ result += character;
390
+ }
391
+ }
392
+ return result;
393
+ }
394
+
395
+ /**
396
+ * Strips leading zeros from decimal numbers in a custom property value
397
+ * (e.g. `0.5` becomes `.5`, `-0.02em` becomes `-.02em`).
398
+ *
399
+ * @param {string} value The custom property value string.
400
+ * @return {string} The value with leading zeros removed from decimals.
401
+ */
402
+ function stripLeadingZerosFromDecimals (value) {
403
+ // Match a boundary (start, whitespace, comma, open-paren), optional sign, then leading zeros before a decimal
404
+ return value.replace(/(^|\s|,|\()(-?)0+(\.\d+)/g, '$1$2$3');
405
+ }
406
+
407
+ /**
408
+ * Collapses whitespace in a custom property value while preserving
409
+ * token boundaries. Each whitespace sequence is reduced to a single
410
+ * space, spaces after commas inside function calls are removed, and
411
+ * leading zeros on decimal numbers are stripped.
412
+ *
413
+ * @param {string} value The raw custom property value string.
414
+ * @return {string} The minified custom property value.
415
+ */
416
+ function collapseCustomPropertyWhitespace (value) {
417
+ // Collapse all whitespace sequences (newlines, tabs, multiple spaces) to a single space
418
+ let collapsed = value.replace(/\s+/g, ' ');
419
+ // Remove spaces after commas only inside function calls (e.g. var(--bar, 1.5) → var(--bar,1.5))
420
+ collapsed = removeSpacesAfterCommasInsideFunctions(collapsed);
421
+ // Strip leading zeros from decimals (e.g. 0.5 → .5, -0.02em → -.02em)
422
+ collapsed = stripLeadingZerosFromDecimals(collapsed);
423
+ return collapsed;
424
+ }
425
+
364
426
  /**
365
427
  * Converts a parsed CSS AST rule node into a minified CSS string, dispatching to specialized handlers for each rule type including selectors, `@media`, `@keyframes`, `@layer`, and other at-rules.
366
428
  *
@@ -517,7 +579,11 @@ function stringifyRule (rule, context, nested = false) {
517
579
  } else if (/^rgb\(\s*\d+\s+\d+\s+\d+\s*\)$/i.test(trimmedRawValue)) {
518
580
  value = ' ' + trimmedRawValue;
519
581
  } else {
520
- value = trimmedRawValue;
582
+ value = collapseCustomPropertyWhitespace(trimmedRawValue);
583
+ // Prepend a space when value starts with a bare decimal point to avoid ambiguity after the colon
584
+ if (value.startsWith('.')) {
585
+ value = ' ' + value;
586
+ }
521
587
  }
522
588
  }
523
589
  } else {