postcss-sort-media-queries 4.2.1 → 4.4.1
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.
- package/README-UZ.md +265 -0
- package/README.md +259 -219
- package/browser.js +54 -54
- package/index.js +52 -52
- package/package.json +95 -88
- package/CHANGELOG.md +0 -276
package/README.md
CHANGED
|
@@ -1,219 +1,259 @@
|
|
|
1
|
-
# PostCSS Sort Media Queries
|
|
2
|
-
|
|
3
|
-
[PostCSS]: https://github.com/postcss/postcss
|
|
4
|
-
[
|
|
5
|
-
[
|
|
6
|
-
[
|
|
7
|
-
|
|
8
|
-
[
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@media screen and (
|
|
48
|
-
.
|
|
49
|
-
}
|
|
50
|
-
@media screen and (
|
|
51
|
-
.
|
|
52
|
-
}
|
|
53
|
-
@media screen and (max-width:
|
|
54
|
-
.
|
|
55
|
-
}
|
|
56
|
-
@media screen and (
|
|
57
|
-
.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@media screen and (min-width:
|
|
71
|
-
.
|
|
72
|
-
}
|
|
73
|
-
@media screen and (
|
|
74
|
-
.
|
|
75
|
-
}
|
|
76
|
-
@media screen and (
|
|
77
|
-
.
|
|
78
|
-
}
|
|
79
|
-
@media screen and (max-width:
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.footer { color: #
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
This
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
})
|
|
194
|
-
]).process(css);
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
1
|
+
# PostCSS Sort Media Queries
|
|
2
|
+
|
|
3
|
+
[PostCSS]: https://github.com/postcss/postcss
|
|
4
|
+
[MIT]: https://github.com/yunusga/postcss-sort-media-queries/blob/master/LICENSE
|
|
5
|
+
[official docs]: https://github.com/postcss/postcss#usage
|
|
6
|
+
[Releases history]: https://github.com/yunusga/postcss-sort-media-queries/blob/master/CHANGELOG.md
|
|
7
|
+
|
|
8
|
+
[](https://www.npmjs.com/package/postcss-sort-media-queries) [](https://github.com/yunusga/postcss-sort-media-queries/actions/workflows/test.yml)
|
|
9
|
+
[](https://www.npmjs.com/package/postcss-sort-media-queries)
|
|
10
|
+
|
|
11
|
+
<img src="logo.svg?sanitize=true" align="right" title="PostCSS sort media queries logotype" width="100" height="100">
|
|
12
|
+
|
|
13
|
+
🌏 **English** ▫ [**O'zbek**](README-UZ.md)
|
|
14
|
+
|
|
15
|
+
[PostCSS] plugin for sorting and combining CSS media queries with **mobile first** / **desktop first** methodologies.
|
|
16
|
+
|
|
17
|
+
> From 5.0.0 plugin support [Media Feature Types: “range”](https://www.w3.org/TR/mediaqueries-4/#mq-ranges)
|
|
18
|
+
|
|
19
|
+
## Table of Contents
|
|
20
|
+
|
|
21
|
+
- [Online demo](#online-demo)
|
|
22
|
+
- [Examples](#examples)
|
|
23
|
+
- [Mobile first sorting](#mobile-first-sorting)
|
|
24
|
+
- [Desktop first sorting](#desktop-first-sorting)
|
|
25
|
+
- [Install](#install)
|
|
26
|
+
- [Usage](#usage)
|
|
27
|
+
- [Options](#options)
|
|
28
|
+
- [sort](#sort)
|
|
29
|
+
- [Custom sort function](#custom-sort-function)
|
|
30
|
+
- [Sort configuration](#sort-configuration)
|
|
31
|
+
- [Changelog](#changelog)
|
|
32
|
+
- [License](#license)
|
|
33
|
+
- [Other PostCSS plugins](#other-postcss-plugins)
|
|
34
|
+
- [Thanks 💪](#thanks)
|
|
35
|
+
|
|
36
|
+
## Online demo
|
|
37
|
+
|
|
38
|
+
And here is the [online demo](https://postcss-sort-media-queries.github.io)
|
|
39
|
+
|
|
40
|
+
## Examples
|
|
41
|
+
|
|
42
|
+
### Mobile first sorting
|
|
43
|
+
|
|
44
|
+
**before**
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
@media screen and (max-width: 640px) {
|
|
48
|
+
.head { color: #cfcfcf }
|
|
49
|
+
}
|
|
50
|
+
@media screen and (max-width: 768px) {
|
|
51
|
+
.footer { color: #cfcfcf }
|
|
52
|
+
}
|
|
53
|
+
@media screen and (max-width: 640px) {
|
|
54
|
+
.main { color: #cfcfcf }
|
|
55
|
+
}
|
|
56
|
+
@media screen and (min-width: 1280px) {
|
|
57
|
+
.mobile-first { color: #cfcfcf }
|
|
58
|
+
}
|
|
59
|
+
@media screen and (min-width: 640px) {
|
|
60
|
+
.mobile-first { color: #cfcfcf }
|
|
61
|
+
}
|
|
62
|
+
@media screen and (max-width: 640px) {
|
|
63
|
+
.footer { color: #cfcfcf }
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**after**
|
|
68
|
+
|
|
69
|
+
```css
|
|
70
|
+
@media screen and (min-width: 640px) {
|
|
71
|
+
.mobile-first { color: #cfcfcf }
|
|
72
|
+
}
|
|
73
|
+
@media screen and (min-width: 1280px) {
|
|
74
|
+
.mobile-first { color: #cfcfcf }
|
|
75
|
+
}
|
|
76
|
+
@media screen and (max-width: 768px) {
|
|
77
|
+
.footer { color: #cfcfcf }
|
|
78
|
+
}
|
|
79
|
+
@media screen and (max-width: 640px) {
|
|
80
|
+
/* combined */
|
|
81
|
+
.head { color: #cfcfcf }
|
|
82
|
+
.main { color: #cfcfcf }
|
|
83
|
+
.footer { color: #cfcfcf }
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Desktop first sorting
|
|
88
|
+
|
|
89
|
+
**before**
|
|
90
|
+
```css
|
|
91
|
+
@media screen and (max-width: 640px) {
|
|
92
|
+
.header { color: #cdcdcd }
|
|
93
|
+
}
|
|
94
|
+
@media screen and (min-width: 760px) {
|
|
95
|
+
.desktop-first { color: #cdcdcd }
|
|
96
|
+
}
|
|
97
|
+
@media screen and (max-width: 640px) {
|
|
98
|
+
.main { color: #cdcdcd }
|
|
99
|
+
}
|
|
100
|
+
@media screen and (min-width: 1280px) {
|
|
101
|
+
.desktop-first { color: #cdcdcd }
|
|
102
|
+
}
|
|
103
|
+
@media screen and (max-width: 760px) {
|
|
104
|
+
.footer { color: #cdcdcd }
|
|
105
|
+
}
|
|
106
|
+
@media screen and (max-width: 640px) {
|
|
107
|
+
.footer { color: #cdcdcd }
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**after**
|
|
112
|
+
|
|
113
|
+
```css
|
|
114
|
+
@media screen and (max-width: 760px) {
|
|
115
|
+
.footer { color: #cdcdcd }
|
|
116
|
+
}
|
|
117
|
+
@media screen and (max-width: 640px) {
|
|
118
|
+
/* combined */
|
|
119
|
+
.header { color: #cdcdcd }
|
|
120
|
+
.main { color: #cdcdcd }
|
|
121
|
+
.footer { color: #cdcdcd }
|
|
122
|
+
}
|
|
123
|
+
@media screen and (min-width: 760px) {
|
|
124
|
+
.desktop-first { color: #cdcdcd }
|
|
125
|
+
}
|
|
126
|
+
@media screen and (min-width: 1280px) {
|
|
127
|
+
.desktop-first { color: #cdcdcd }
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Install
|
|
132
|
+
|
|
133
|
+
First thing's, install the module:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
npm install postcss postcss-sort-media-queries --save-dev
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Usage
|
|
140
|
+
|
|
141
|
+
Check you project for existed PostCSS config: `postcss.config.js`
|
|
142
|
+
in the project root, `"postcss"` section in `package.json`
|
|
143
|
+
or `postcss` in bundle config.
|
|
144
|
+
|
|
145
|
+
If you already use PostCSS, add the plugin to plugins list:
|
|
146
|
+
|
|
147
|
+
```diff
|
|
148
|
+
module.exports = {
|
|
149
|
+
plugins: [
|
|
150
|
+
+ require('postcss-sort-media-queries')({
|
|
151
|
+
+ sort: 'mobile-first', // default value
|
|
152
|
+
+ }),
|
|
153
|
+
require('autoprefixer')
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
or with custom sort function
|
|
159
|
+
```diff
|
|
160
|
+
module.exports = {
|
|
161
|
+
plugins: [
|
|
162
|
+
+ require('postcss-sort-media-queries')({
|
|
163
|
+
+ sort: function(a, b) {
|
|
164
|
+
+ // custom sorting function
|
|
165
|
+
+ }
|
|
166
|
+
+ }),
|
|
167
|
+
require('autoprefixer')
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
If you do not use PostCSS, add it according to [official docs]
|
|
173
|
+
and set this plugin in settings.
|
|
174
|
+
|
|
175
|
+
## Options
|
|
176
|
+
|
|
177
|
+
> Sorting works based on [dutchenkoOleg/sort-css-media-queries](https://github.com/dutchenkoOleg/sort-css-media-queries) function.
|
|
178
|
+
|
|
179
|
+
### sort
|
|
180
|
+
|
|
181
|
+
This option support **string** or **function** values.
|
|
182
|
+
|
|
183
|
+
- `{string}` `'mobile-first'` - (default) mobile first sorting
|
|
184
|
+
- `{string}` `'desktop-first'` - desktop first sorting
|
|
185
|
+
- `{function}` your own sorting function
|
|
186
|
+
|
|
187
|
+
#### `'mobile-first'`
|
|
188
|
+
|
|
189
|
+
```js
|
|
190
|
+
postcss([
|
|
191
|
+
sortMediaQueries({
|
|
192
|
+
sort: 'mobile-first' // default
|
|
193
|
+
})
|
|
194
|
+
]).process(css);
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### `'desktop-first'`
|
|
198
|
+
|
|
199
|
+
```js
|
|
200
|
+
postcss([
|
|
201
|
+
sortMediaQueries({
|
|
202
|
+
sort: 'desktop-first'
|
|
203
|
+
})
|
|
204
|
+
]).process(css);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Custom sort function
|
|
208
|
+
```js
|
|
209
|
+
postcss([
|
|
210
|
+
sortMediaQueries({
|
|
211
|
+
function(a, b) {
|
|
212
|
+
return a.localeCompare(b);
|
|
213
|
+
}
|
|
214
|
+
})
|
|
215
|
+
]).process(css);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
In this example, all your media queries will sort by A-Z order.
|
|
219
|
+
|
|
220
|
+
This sorting function is directly passed to Array#sort() method of an array of all your media queries.
|
|
221
|
+
|
|
222
|
+
### Sort configuration
|
|
223
|
+
|
|
224
|
+
By this configuration you can control sorting behaviour.
|
|
225
|
+
|
|
226
|
+
```js
|
|
227
|
+
postcss([
|
|
228
|
+
sortMediaQueries({
|
|
229
|
+
configuration: {
|
|
230
|
+
unitlessMqAlwaysFirst: true, // or false
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
]).process(css);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Or alternatively create a `sort-css-mq.config.json` file in the root of your project. Or add property `sortCssMQ: {}` in your `package.json`.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Changelog
|
|
241
|
+
|
|
242
|
+
See [Releases history]
|
|
243
|
+
|
|
244
|
+
## License
|
|
245
|
+
|
|
246
|
+
[MIT]
|
|
247
|
+
|
|
248
|
+
## Other PostCSS plugins
|
|
249
|
+
|
|
250
|
+
- [`postcss-momentum-scrolling`](https://github.com/solversgroup/postcss-momentum-scrolling) - plugin for adding **momentum** style scrolling behavior (`-webkit-overflow-scrolling:touch`) for elements with overflow (scroll, auto) on iOS
|
|
251
|
+
|
|
252
|
+
## Thanks
|
|
253
|
+
|
|
254
|
+
- Andrey Sitnik [@ai](https://github.com/ai)
|
|
255
|
+
- Oleh Dutchenko [@dutchenkoOleg](https://github.com/dutchenkoOleg)
|
|
256
|
+
- Jakub Caban [@Lustmored](https://github.com/Lustmored)
|
|
257
|
+
- Dmytro Symonov [@Kassaila](https://github.com/Kassaila)
|
|
258
|
+
- Kai Falkowski [@SassNinja](https://github.com/SassNinja)
|
|
259
|
+
- Khayot Razzakov [@SassNinja](https://github.com/Khayotbek1)
|
package/browser.js
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
function sortAtRules(queries, sort, sortCSSmq) {
|
|
2
|
-
if (typeof sort !== 'function') {
|
|
3
|
-
sort = sort === 'desktop-first' ? sortCSSmq.desktopFirst : sortCSSmq
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
return queries.sort(sort)
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
module.exports = (opts = {}) => {
|
|
10
|
-
|
|
11
|
-
opts = Object.assign(
|
|
12
|
-
{
|
|
13
|
-
sort: 'mobile-first',
|
|
14
|
-
configuration: {
|
|
15
|
-
unitlessMqAlwaysFirst: false,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
opts
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
const createSort = require('sort-css-media-queries/lib/create-sort');
|
|
22
|
-
const sortCSSmq = createSort(opts.configuration);
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
postcssPlugin: 'postcss-sort-media-queries',
|
|
26
|
-
OnceExit(root, { AtRule }) {
|
|
27
|
-
|
|
28
|
-
let atRules = [];
|
|
29
|
-
|
|
30
|
-
root.walkAtRules('media', atRule => {
|
|
31
|
-
let query = atRule.params
|
|
32
|
-
|
|
33
|
-
if (!atRules[query]) {
|
|
34
|
-
atRules[query] = new AtRule({
|
|
35
|
-
name: atRule.name,
|
|
36
|
-
params: atRule.params,
|
|
37
|
-
source: atRule.source
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
atRule.nodes.forEach(node => {
|
|
42
|
-
atRules[query].append(node.clone())
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
atRule.remove()
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
sortAtRules(Object.keys(atRules), opts.sort, sortCSSmq).forEach(query => {
|
|
49
|
-
root.append(atRules[query])
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
module.exports.postcss = true
|
|
1
|
+
function sortAtRules(queries, sort, sortCSSmq) {
|
|
2
|
+
if (typeof sort !== 'function') {
|
|
3
|
+
sort = sort === 'desktop-first' ? sortCSSmq.desktopFirst : sortCSSmq
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
return queries.sort(sort)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
module.exports = (opts = {}) => {
|
|
10
|
+
|
|
11
|
+
opts = Object.assign(
|
|
12
|
+
{
|
|
13
|
+
sort: 'mobile-first',
|
|
14
|
+
configuration: {
|
|
15
|
+
unitlessMqAlwaysFirst: false,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
opts
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const createSort = require('sort-css-media-queries/lib/create-sort');
|
|
22
|
+
const sortCSSmq = createSort(opts.configuration);
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
postcssPlugin: 'postcss-sort-media-queries',
|
|
26
|
+
OnceExit(root, { AtRule }) {
|
|
27
|
+
|
|
28
|
+
let atRules = [];
|
|
29
|
+
|
|
30
|
+
root.walkAtRules('media', atRule => {
|
|
31
|
+
let query = atRule.params
|
|
32
|
+
|
|
33
|
+
if (!atRules[query]) {
|
|
34
|
+
atRules[query] = new AtRule({
|
|
35
|
+
name: atRule.name,
|
|
36
|
+
params: atRule.params,
|
|
37
|
+
source: atRule.source
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
atRule.nodes.forEach(node => {
|
|
42
|
+
atRules[query].append(node.clone())
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
atRule.remove()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
sortAtRules(Object.keys(atRules), opts.sort, sortCSSmq).forEach(query => {
|
|
49
|
+
root.append(atRules[query])
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
module.exports.postcss = true
|